PHP/Perl正则表达式帮助



我有一个字符串:

$string = "This is my big <span class="big-string">string</span>";

我不知道如何写一个正则表达式来替换'big'中的'b'而不替换'big-string'中的'b'。我需要替换子字符串的所有出现,除非该子字符串出现在html标记中。

任何帮助都是感激的!

编辑

也许更多的信息会有帮助。我正在开发一个自动补全功能,它可以突出显示你在当前结果集中搜索的内容。目前,如果您在搜索对话框中输入'aut',那么结果看起来像这样:aut motive

当我搜索'auto b'时出现问题。首先,我将所有出现的'auto'替换为' <b>auto</b> ',然后将所有出现的'b'替换为' <b>b</b> '。不幸的是,第二次扫描将' <b>auto</b> '更改为' <<b>b</b>>auto</<b>b</b>> '

请勿尝试使用正则表达式解析HTML。只需将HTML加载到DOM中,遍历文本节点并执行简单的str_replace。调试的时候你会感谢我的。

是否保证'big'不会立即被"所取代?如果是这样,那么s/([^"])b/$1foo/应该用foo替换b

如果你坚持使用正则表达式,下面这个会做得很好:

$re = '/# (Crudely) match a sub-string NOT in an HTML tag.
    big        # The sub-string to be matched.
    (?=        # Assert we are not inside an HTML tag.
      [^<>]*   # Consume all non-<> up to...
      (?:<w+  # either an HTML start tag,
      | $      # or the end of string.
      )        # End group of valid alternatives.
    )          # End "not-in-html-tag" lookahead assertion.
    /ix';

注意:这个正则表达式有非常实际的限制。HTML的标签属性中不能有任何尖括号。这个正则表达式还可以在HTML文件的其他部分(如注释、脚本和样式表)中找到目标子字符串,这可能是不可取的。

最新更新