php preg_match_all 条件模式

php preg_match_all conditional pattern

php 模式正则表达式语法的东西真的让我头疼...我正在尝试匹配所有 javascript 标签,除了带有 id="pagespeed" 的 js 标签,以便我可以把它们移到别处。我只需要模式条件,其他的都搞定了。

我有这个:

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

它找到了所有标签,现在我需要检查异常条件是否为真。应该是这样的:

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

该行可能有误,需要与上面的行合并。如果有人能帮助我,那就太好了,因为我似乎很讨厌这种 PCRE 语法:(

由于您处理的是结构化数据,更简单的方法是使用结构并对其进行查询,而不是使用文本方法。此外,这种方法将防止您陷入许多可能包含 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();

为此,我会使用@Casimir 的回答。如果您正在寻找正则表达式,请使用以下模式:

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

DEMO