Php 仅将HTML语句外的单词与正则表达式匹配

Php 仅将HTML语句外的单词与正则表达式匹配,php,regex,preg-match,Php,Regex,Preg Match,我想用下面的代码实现的目标是:匹配指定的单词,不区分大小写,在文本中只匹配一次,并用链接替换它 我有以下preg_match来匹配字符串中的单词“foo”: if (preg_match("/\bfoo\b/i", $text, $results, PREG_OFFSET_CAPTURE)) { // substr_replace the word 'foo' for a link <a href.. } if(preg\u match(“/\bfoo\b/i“,$text,$r

我想用下面的代码实现的目标是:匹配指定的单词,不区分大小写,在文本中只匹配一次,并用链接替换它

我有以下preg_match来匹配字符串中的单词“foo”:

if (preg_match("/\bfoo\b/i", $text, $results, PREG_OFFSET_CAPTURE)) { 
  // substr_replace the word 'foo' for a link <a href.. 
}
if(preg\u match(“/\bfoo\b/i“,$text,$results,preg\u OFFSET\u CAPTURE)){
//substr_将“foo”一词替换为链接concertetur adipising elit foo bar。
在这种情况下,当前链接中会有一个新链接,因为href部分中会有一个与foo匹配的链接(标题和名称部分也有相同的问题)

如何将模式更改为仅匹配HTML语句外的“foo”?

。改用。PHP可以很容易地实现

所需的XPath表达式非常简单。假设要在其中搜索的标记是
div
,这就是所需的:

//div/text()[contains(.,'foo')]

一旦你有了文本节点,你就可以在上面运行一个正则表达式,而不用担心它包含任何HTML标记。

你可以计算到目前为止遇到的开始括号和结束括号的数量。如果它们不同,这意味着你已经打开了一个括号,而没有遇到结束括号,这意味着你已经出现了HTML标记中的y


但是,请注意,一般来说,使用正则表达式进行HTML解析是很有意义的。

但在这种情况下,文本中只有一些固定格式的链接,而没有其他HTML。因此,使用XPath可能会被过度填充。好吧,使用正则表达式是不可能的。我将在一周中的任何一天对不可能的内容进行过度填充。
//div/text()[contains(.,'foo')]