我正在尝试构建一个正则表达式以匹配文本块中的关键字。这些关键字将随后添加链接。链接中已经存在的任何关键字都不应匹配。
我找到了一篇让我了解90%的帖子的信息-PHP正则表达式以匹配HTML标签<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>
通过在搜索词之后添加另一个前瞻?这是一个非常复杂的模式,但似乎可以使用:
Word(?![^<]*?>)(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)
解释:
Word
(?! # that is not followed by
[^<]* # zero or more of anything anything that is not <
?> # lazily up to >
) # end lookahead
中的<span class="Word">
,由于前瞻而[^<]*?>
匹配">
并失败。
中的<a href="/Word" alt="Word">
,[^<]*?>
匹配" alt="Word">
失败。
由于我不确定其中的几个元素,因此我将在表达式的这一部分中将其从属于它的线程中解脱出来。
(?!(?>[^<]*(?:<(?!/?a\b)[^<]*)*)</a>)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句