diff --git a/ext/dom/html5_serializer.c b/ext/dom/html5_serializer.c
index f0d43f09afb..f61254257ab 100644
--- a/ext/dom/html5_serializer.c
+++ b/ext/dom/html5_serializer.c
@@ -70,7 +70,17 @@ static zend_result dom_html5_escape_string(dom_html5_serialize_context *ctx, con
{
const char *last_output = content;
- while (*content != '\0') {
+ /* Note: uses UTF-8 internally, so indicates a non-breaking space */
+ const char *mask = attribute_mode ? "&\xC2\"" : "&\xC2<>";
+
+ while (true) {
+ size_t chunk_length = strcspn(content, mask);
+
+ content += chunk_length;
+ if (*content == '\0') {
+ break;
+ }
+
switch (*content) {
/* Step 1 */
case '&': {
@@ -93,29 +103,23 @@ static zend_result dom_html5_escape_string(dom_html5_serialize_context *ctx, con
/* Step 3 */
case '"': {
- if (attribute_mode) {
- TRY(ctx->write_string_len(ctx->application_data, last_output, content - last_output));
- TRY(ctx->write_string_len(ctx->application_data, """, strlen(""")));
- last_output = content + 1;
- }
+ TRY(ctx->write_string_len(ctx->application_data, last_output, content - last_output));
+ TRY(ctx->write_string_len(ctx->application_data, """, strlen(""")));
+ last_output = content + 1;
break;
}
/* Step 4 */
case '<': {
- if (!attribute_mode) {
- TRY(ctx->write_string_len(ctx->application_data, last_output, content - last_output));
- TRY(ctx->write_string_len(ctx->application_data, "<", strlen("<")));
- last_output = content + 1;
- }
+ TRY(ctx->write_string_len(ctx->application_data, last_output, content - last_output));
+ TRY(ctx->write_string_len(ctx->application_data, "<", strlen("<")));
+ last_output = content + 1;
break;
}
case '>': {
- if (!attribute_mode) {
- TRY(ctx->write_string_len(ctx->application_data, last_output, content - last_output));
- TRY(ctx->write_string_len(ctx->application_data, ">", strlen(">")));
- last_output = content + 1;
- }
+ TRY(ctx->write_string_len(ctx->application_data, last_output, content - last_output));
+ TRY(ctx->write_string_len(ctx->application_data, ">", strlen(">")));
+ last_output = content + 1;
break;
}
}