Php preg_匹配的条件前瞻

Php preg_匹配的条件前瞻,php,regex,preg-match,preg-match-all,Php,Regex,Preg Match,Preg Match All,我有以下代码来提取javascript代码: preg_match_all('#<script(?:[^>]+)?>(.*?)</script>#is', $GLOBALS['content'], $matches, PREG_SET_ORDER) preg#u match_all('#]+)?>(.*?#is',$GLOBALS['content'],$matches,preg#u SET_顺序) 它在这方面非常有效: <script type="tex

我有以下代码来提取javascript代码:

preg_match_all('#<script(?:[^>]+)?>(.*?)</script>#is', $GLOBALS['content'], $matches, PREG_SET_ORDER)
preg#u match_all('#]+)?>(.*?#is',$GLOBALS['content'],$matches,preg#u SET_顺序)
它在这方面非常有效:

<script type="text/javascript">
<script type="application/javascript">
<script>

但我如何避免匹配

正如@Wiktor所说(使用负前瞻)或使用解析器:

<?php

$data = <<<DATA
<script type="text/javascript">some js code here</script>
<script type="application/javascript">some other code here</script>
<script>This looks naked, dude!</script>
<script type="application/ld+json">THIS MUST NOT BE MATCHED</script>
DATA;

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

$xpath = new DOMXPath($dom);
$scripts = $xpath->query("//script[not(@type='application/ld+json')]");
foreach ($scripts as $script) {
    # code...
}
?>
如@Wiktor所说(使用负前瞻)或使用解析器:

<?php

$data = <<<DATA
<script type="text/javascript">some js code here</script>
<script type="application/javascript">some other code here</script>
<script>This looks naked, dude!</script>
<script type="application/ld+json">THIS MUST NOT BE MATCHED</script>
DATA;

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

$xpath = new DOMXPath($dom);
$scripts = $xpath->query("//script[not(@type='application/ld+json')]");
foreach ($scripts as $script) {
    # code...
}
?>

以下操作应该有效:

<script(?!\stype="application\/ld\+json")[^>]*>(.*?)<\/script>
]*>(**?)
它使用负前瞻来排除不需要的JSON。您可能不需要避开反斜杠。但是您需要避开+登录ld+json,以防止它被当作量词而不是逐字处理

在行动中看到它:


如果需要调整/进一步详细信息,请发表意见。

以下内容应适用:

<script(?!\stype="application\/ld\+json")[^>]*>(.*?)<\/script>
]*>(**?)
它使用负前瞻来排除不需要的JSON。您可能不需要避开反斜杠。但是您需要避开+登录ld+json,以防止它被当作量词而不是逐字处理

在行动中看到它:


如果需要调整/进一步详细信息,请发表意见。

与@Wiktor的解决方案相反,以匹配任何javascript

<script type="text/javascript">...</script>
<script type="application/javascript">...</script>
<script>...</script>
。。。
...
...
…并跳过任何其他类型,请使用:

 #<script(?:[^>]*\stype="(?:application|text)/javascript")?[^>]*>(.*?)</script>#i‌​s
#]*\stype=“(?:应用程序|文本)/javascript”)?[^>]*>(.*)i‌​s

与@Wiktor的解决方案相反,以匹配任何javascript

<script type="text/javascript">...</script>
<script type="application/javascript">...</script>
<script>...</script>
。。。
...
...
…并跳过任何其他类型,请使用:

 #<script(?:[^>]*\stype="(?:application|text)/javascript")?[^>]*>(.*?)</script>#i‌​s
#]*\stype=“(?:应用程序|文本)/javascript”)?[^>]*>(.*)i‌​s

'.*\stype=“application/ld+json”)[^>]*>(.*)是“
您只是想匹配Javascript吗?是的,只有javasscript。也许相反的条件最好?如果参数类型没有设置或设置为text/javascript或application/javascript。加号肯定应该转义,我在一个非常不舒服的位置键入:)With
“#]*\stype=“application/ld+json”)[^>]*>(.*)是“
你只是想匹配javascript吗?是的,只有javascript。也许相反的条件最好?如果参数类型没有设置或设置为text/javascript或application/javascript。加号肯定应该转义,我在一个非常不舒服的位置键入:)