Регулярное выражение соответствует множественному появлению функции js между - PullRequest
0 голосов
/ 02 мая 2020

Я надеюсь, что кто-то может мне помочь ... Я не эксперт по регулярным выражениям, и я ищу решение для обработки подстановки текста.

У меня есть HTML код, подобный этому:

<script>
...something here...
</script>

<script type="text/javascript">
...something here...
</script>

...something here...

<script type="text/javascript">
1st occurrence
...something here...
fbq(...something here...)
...something here...
</script>

...something here...

<script type="text/javascript">
2nd occurrence
...something here...
fbq(...something here...)
</script>

...something here...

Мне нужно найти всю строку между ', которая содержит функцию fbq. Таким образом, в моем примере мне нужно иметь:

Group1:

<script type="text/javascript">
//1st occurrence
...something here...
fbq(...something here...)
...something here...
</script>

Group2:

<script type="text/javascript">
2nd occurrence
...something here...
fbq(...something here...)
</script>

И так далее, если есть еще вхождения. Я думаю, что будет также хорошо иметь больше совпадений вместо нескольких групп.

Внимание: в моем коде может быть много строк <script, которые не содержат функцию 'fbq', и я могу Я не уверен, как они расположены и находятся ли они в новой строке или нет.

Я пробовал много кодов регулярных выражений, но не могу найти что-то, что работает.

Т.е. с помощью

(?:^.*)(<script.*fbq.*<\/script>)(?:.*$)

или

.*(<script.*fbq.*<\/script>).*

Я могу найти только последнее вхождение fbq (в моем примере только 2-е вхождение).

Я также пытался играть с включением групп, но без удачи.

Тогда мне нужно использовать это регулярное выражение в PHP коде, для подстановки с использованием preg_replace

Любое предложение очень приветствуется

Заранее спасибо !

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Вы должны проанализировать HTML, найти нужные элементы и использовать регулярное выражение для содержимого элемента. Поиск текста в HTML коде (из других источников) очень случайная игра. Попробуйте DOMDocument и DOMXPath

        $doc = new \DOMDocument;
        $doc->preserveWhiteSpace = 0;
        $doc->strictErrorChecking = 0;
        libxml_use_internal_errors(true);

        $doc->loadHTML($html);

        $xpath = new \DOMXPath($doc);
        // search all script element as nodeList
        $nodeList = $xpath->query('//script');
        foreach ($nodeList as $node) {

            $node->nodeValue = 'Hello, world!'; // or some text changes,
            // but remember that comments are special nodes in DOM
            $node->parentNode->replaceChild($node, $node);
        }

        print $doc->saveHTML();
0 голосов
/ 02 мая 2020

Может быть, в будущем кому-нибудь пригодится, вот мой окончательный код:

function fix_iubenda_pixelWoocommerce( $buffer ) {
        $doc = new \DOMDocument;
        $doc->preserveWhiteSpace = 0;
        $doc->strictErrorChecking = 0;
        libxml_use_internal_errors(true);

        $doc->loadHTML($buffer);

        $xpath = new \DOMXPath($doc);
        $nodeList = $xpath->query('//script[contains(., "fbq(")]');
        foreach ($nodeList as $node) {
                $node->nodeValue = $node->nodeValue ;
                $node->setAttribute('type', 'text/plain');
                $node->setAttribute('class', '_iub_cs_activate-inline');
        }

        $buffer = $doc->saveHTML();
        return $buffer;
}

Еще раз спасибо Павлу и Найджелу за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...