我有一个字符串:
$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文件的其他部分(如注释、脚本和样式表)中找到目标子字符串,这可能是不可取的。