1

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

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

if (preg_match("/\bfoo\b/i", $text, $results, PREG_OFFSET_CAPTURE)) { 
  // substr_replace the word 'foo' for a link <a href.. 
}

没有 HTML 的文本没有问题,但是想象以下带有 HTML 的文本:

Lorem ipsum dolor sit amet, <a href="/foo-bar/" title="foo bar">some other foo link</a> consectetur adipiscing elit foo bar.

在这种情况下,当前链接中将有一个新链接,因为在 href-part 中会有一个与 foo 匹配的内容(标题和名称部分的问题相同)。

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

4

2 回答 2

3

不要用正则表达式解析 HTML。请改用XPath。PHP 可以很容易地利用它

您想要的 XPath 表达式非常简单。假设您要在其中搜索的标签是 a div,这就是您想要的:

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

拥有文本节点后,您可以在其上运行正则表达式,而不必担心它包含任何 HTML 标记。

于 2009-12-23T14:11:12.693 回答
0

您可以计算到目前为止遇到的左括号和右括号的数量。如果它们不同,则意味着您已经打开了一个括号,但还没有遇到结束的括号,这意味着您当前位于 HTML 标记内。

但是,请注意,一般来说,使用正则表达式进行 HTML 解析是一个糟糕的主意

于 2009-12-23T14:11:41.727 回答