匹配正则表达式中的html标记内容

时间:2013-04-24 19:18:50

标签: php html regex

我知道“不要使用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

2 个答案:

答案 0 :(得分:3)

匹配 - 任何 - 但确实通常使用否定前瞻实施:

 ((?!exclude).)*?

诀窍是不要重复.点。但是要让它连续匹配任何角色,同时确保角色不是被排除词的开头。

在您的情况下,您希望使用此而不是初始.*?

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

答案 1 :(得分:0)

像那样:

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

但DOM是迄今为止更好的方法。