diff --git a/ext/standard/string.c b/ext/standard/string.c
index 30eb52e6018..693cff0cc67 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -6538,7 +6538,10 @@ PHPAPI int php_u_strip_tags(UChar *rbuf, int len, int *stateptr, UChar *allow, i
case 0x22: /* '"' */
case 0x27: /* '\'' */
- if (state == 2 && prev1 != 0x5C) { /* '\\' */
+ if (state == 4){
+ /* Inside */
+ break;
+ } else if (state == 2 && prev1 != 0x5C) { /* '\\' */
if (last == ch) {
last = 0x00;
} else if (last != 0x5C) {
@@ -6779,7 +6782,10 @@ PHPAPI size_t php_strip_tags_ex(char *rbuf, int len, int *stateptr, char *allow,
case '"':
case '\'':
- if (state == 2 && *(p-1) != '\\') {
+ if (state == 4) {
+ /* Inside */
+ break;
+ } else if (state == 2 && *(p-1) != '\\') {
if (lc == c) {
lc = '\0';
} else if (lc != '\\') {
diff --git a/ext/standard/tests/strings/bug46578.phpt b/ext/standard/tests/strings/bug46578.phpt
new file mode 100644
index 00000000000..ba9fbbe4604
--- /dev/null
+++ b/ext/standard/tests/strings/bug46578.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Bug #46578 (strip_tags() does not honor end-of-comment when it encounters a single quote)
+--FILE--
+foobar'));
+
+var_dump(strip_tags('foobar'));
+
+var_dump(strip_tags('foo= foo! /* */ ?>bar'));
+
+var_dump(strip_tags('< ax'));
+
+var_dump(strip_tags(''));
+
+var_dump(strip_tags(' ax'));
+
+?>
+--EXPECTF--
+%string|unicode%(6) "foobar"
+%string|unicode%(6) "foobar"
+%string|unicode%(6) "foobar"
+%string|unicode%(4) "< ax"
+%string|unicode%(0) ""
+%string|unicode%(0) ""