0

我正在尝试构建一个正则表达式来匹配文本块中的关键字。然后,这些关键字将添加链接。不应匹配已在链接中的任何关键字。

我找到了一篇让我完成了 90% 的帖子 - PHP Regular expression to match keyword outside HTML tag <a>

该解决方案允许 img alt 属性中的任何关键字匹配,但会破坏 img 标签。有没有办法修改正则表达式以禁止 alt 属性中的关键字?

这是我现在拥有的正则表达式(在 PHP 中):

$content = preg_replace(' ~'.$keyword.'(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)~i', '<a href="'.$url.'">$0</a>', $content);

我有一组关键字/网址,例如

'consectetur' => '/path/to/consectetur'

所以如果我有这个文本:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

关键字“consectetur”应替换为:

<a href="/path/to/consectetur">consectetur</a>

但如果它出现在这里:

<img src="..." alt="consectetur adipisicing elit">

或在这里:

<a href="">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</a>
4

1 回答 1

2

通过在搜索词后添加另一个前瞻?这是一个非常复杂的模式,但似乎它会起作用:

Word(?![^<]*?>)(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)

解释:

Word
(?!         # that is not followed by
[^<]*       # zero or more of anything anything that is not <
?>          # lazily up to >
)           # end lookahead

in <span class="Word">,[^<]*?>匹配">并因前瞻而失败。

<a href="/Word" alt="Word">,[^<]*?>匹配" alt="Word">和失败。

这部分表达我将留给海报从它所属的线程解释,因为我不完全确定其中的几个元素。

(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)
于 2013-07-05T16:23:29.467 回答