Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Not valid HTML fragment!" using svg in style tag #87

Open
gjwnc opened this issue Aug 10, 2022 · 0 comments
Open

"Not valid HTML fragment!" using svg in style tag #87

gjwnc opened this issue Aug 10, 2022 · 0 comments
Assignees

Comments

@gjwnc
Copy link

gjwnc commented Aug 10, 2022

What is this feature about (expected vs actual behaviour)?

We are using the package (https://github.com/CarbonPackages/Carbon.Compression) on a larger project to minify the generated HTML. There is a case, where we have an svg in the CSS which causes an exception thrown here.

I noticed, there was already an issue and some kind of a fix. So, I'm not sure if this is unrelated to the previous fixed issue #81.

In the previous issue, it is mentioned that the problem is that php do not support html5 or svg by default. Does that mean this cannot be fixed? What exactly is the issue here with php / html5?

How can I reproduce it?

I've created a testcase below which just replicates the failing lines from SimpleHtmlDom. For the sake simplicity I just copied the original normalizeStringForComparison.

Testcase
<?php

use \voku\helper\HtmlDomParser;

require __DIR__ . '/vendor/autoload.php';

$string = '<style>lite-youtube>.lty-playbtn{background-color:transparent;background-image:url(\'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 68 48"><path d="M66.52 7.74c-.78-2.93-2.49-5.41-5.42-6.19C55.79.13 34 0 34 0S12.21.13 6.9 1.55c-2.93.78-4.63 3.26-5.42 6.19C.06 13.05 0 24 0 24s.06 10.95 1.48 16.26c.78 2.93 2.49 5.41 5.42 6.19C12.21 47.87 34 48 34 48s21.79-.13 27.1-1.55c2.93-.78 4.64-3.26 5.42-6.19C67.94 34.95 68 24 68 24s-.06-10.95-1.48-16.26z" fill="red"/><path d="M45 24 27 14v20" fill="white"/></svg>\');-webkit-filter:grayscale(100%)}</style>';

$newDocument = new HtmlDomParser($string);

$tmpDomOuterTextString = normalizeStringForComparison($newDocument);
$tmpStr = normalizeStringForComparison($string);

if ($tmpDomOuterTextString !== $tmpStr) {
    var_dump("FAILED", $tmpDomOuterTextString, $tmpStr);
}
else{
    var_dump("SUCCESS");
}

function normalizeStringForComparison($input): string
{
    if ($input instanceof HtmlDomParser) {
        $string = $input->html(false, false);

        if ($input->getIsDOMDocumentCreatedWithoutHeadWrapper()) {
            /** @noinspection HtmlRequiredTitleElement */
            $string = \str_replace(['<head>', '</head>'], '', $string);
        }
    } else {
        $string = (string) $input;
    }

    return
        \urlencode(
          \urldecode(
               \trim(
                    \str_replace(
                         [
                            ' ',
                            "\n",
                            "\r",
                            '/>',
                        ],
                        [
                            '',
                            '',
                            '',
                            '>',
                        ],
                        \strtolower($string)
                    )
                )
            )
         );
}

Does it take minutes, hours or days to fix?

🤷

Any additional information?

PHP 8.1.4

@voku voku self-assigned this Aug 10, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants