regex — условный шаблон php preg_match_all

Синтаксические особенности шаблонов php regex вызывают у меня головную боль … Я пытаюсь сопоставить все теги javascript, кроме тегов js с id = «pagespeed», чтобы я мог переместить их куда-нибудь еще. Все, что мне нужно, это условие шаблона, все остальное сделано.

У меня есть это:

  $jsPattern = '#<script.*</script>#isUm';

который находит все теги, и теперь мне нужно проверить, что исключительное условие не соответствует действительности. Должно быть что-то вроде:

 ~^<script.+id=\"pagespeed\".*</script>]~

Линия, вероятно, неверна и должна быть объединена с линией выше. Было бы здорово, если бы кто-то мог мне помочь, так как мне кажется, что этот синтаксис PCRE сосет

0

Решение

Я бы использовал ответ @ Casimir для этой цели .. Если вы ищете регулярное выражение .. используйте следующий шаблон:

<script[^>]*id="(?!pagespeed\b)[^"]+".*<\/script>

Увидеть DEMO

0

Другие решения

Поскольку вы имеете дело со структурированными данными, более простой способ — использовать структуру и запрашивать ее, а не использовать текстовый подход. Кроме того, этот подход предотвратит попадание во многие ловушки, которые могут содержать HTML-код.

$dom = new DOMDocument;
$dom->loadHTML($html);

$xp = new DOMXPath($dom);

$scriptNodeList = $xp->query('//script[not(@id="pagespeed")]');

foreach ($scriptNodeList as $scriptNode) {
$scriptNode->parentNode->removeChild($scriptNode);
}

echo $dom->saveHTML();
2

По вопросам рекламы [email protected]