我知道“不要使用regex for html”,但严重的是,加载整个html解析器并不总是一种选择。
所以,这是场景
<script...>
some stuff
</script>
<script...>
var stuff = '<';
anchortext
</script>
如果你这样做:
<script[^>]*?>.*?anchor.*?</script>
您将从第一个脚本标记捕获到第二个块中的/ script。有办法做一个。*?但通过更换。匹配块,如:
<script[^>]*?>(^</script>)*?anchor.*?</script>
我看过负面的前瞻等,但我无法正常工作。通常我只是使用[^&gt;] *?为避免跳过关闭块,但在此特定示例中,脚本内容具有“&lt;”在它中,它会在到达anchortext之前停止匹配。
为了简化,我需要像[^ z] *这样的东西?但是我需要一个捕获组来匹配一个字符串,而不是单个字符或字符范围。
.*?(?!z) doesn't have the same effect as [^z]*? as I assumed it would.
以下是我被困在的地方:http://regexr.com?34llp
答案 0 :(得分:3)
匹配 - 任何 - 但确实通常使用否定前瞻实施:
((?!exclude).)*?
诀窍是不要重复.
点。但是要让它连续匹配任何角色,同时确保角色不是被排除词的开头。
在您的情况下,您希望使用此而不是初始.*?
<script[^>]*?>((?!</script>).)*?anchor.*?</script>
答案 1 :(得分:0)
$pattern = '~<script[^>]*+>((?:[^<]+?|<++(?!/script>))*?\banchor(?:[^<]+?|<++(?!/script>))*+)</script>~';
但DOM是迄今为止更好的方法。