0

我知道“不要对 html 使用正则表达式”,但说真的,加载整个 html 解析器并不总是一种选择。

所以,这是场景

<script...>
    some stuff
</script>

<script...>
    var stuff = '<';
    anchortext
</script>

如果你这样做:

<script[^>]*?>.*?anchor.*?</script>

您将从第一个脚本标记捕获到第二个块中的 /script。有没有办法做一个。*?但是通过替换 . 使用匹配块,例如:

<script[^>]*?>(^</script>)*?anchor.*?</script>

我查看了负前瞻等,但我无法让某些东西正常工作。通常我只使用 [^>]*? 为了避免跑过结束块,但在这个特定的例子中,脚本内容中有一个“<”,它在到达锚文本之前停止匹配。

为了简化,我需要类似 [^z]*? 但我需要一个捕获组来适应字符串,而不是单个字符或字符范围。

.*?(?!z) doesn't have the same effect as [^z]*? as I assumed it would.

这是我被困在的地方:http ://regexr.com?34llp

4

2 回答 2

3

Match-anything-but 确实通常使用负前瞻来实现:

 ((?!exclude).)*?

诀窍是不要.重复点。但要使其连续匹配任何字符,同时确保该字符不是排除词的开头。

在你的情况下,你会想要这个而不是最初的.*?

 <script[^>]*?>((?!</script>).)*?anchor.*?</script>
于 2013-04-24T19:30:34.617 回答
0

像那样:

$pattern = '~<script[^>]*+>((?:[^<]+?|<++(?!/script>))*?\banchor(?:[^<]+?|<++(?!/script>))*+)</script>~';

但是 DOM 是更好的方法。

于 2013-04-24T19:46:13.037 回答