正则表达式以匹配不在<a>标签或alt属性内的关键字

马丁·佩茨(Martin Petts)

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

我找到了一篇让我了解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>
mzmm56

通过在搜索词之后添加另一个前瞻?这是一个非常复杂的模式,但似乎可以使用:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PHP正则表达式替换文本中的关键字但不在锚标签内

仅当不在标签内时才匹配正则表达式

仅当不在html属性中匹配时才提高正则表达式性能

正则表达式匹配字符串不在括号内

正则表达式以匹配不在嵌套块中的括号或大括号内的管道

正则表达式:匹配双新行但不在反引号内

正则表达式以匹配所有不在引号内的实例

正则表达式拆分不在匹配大括号内的空格

正则表达式匹配字符串内但不在开头

使用正则表达式替换html标签和锚点(a)标签文本外部的匹配关键字

正则表达式查找不在“(和””内的逗号

正则表达式删除不在括号内的文本

正则表达式匹配HTML标签和属性

正则表达式匹配标签内的特定文本

匹配部分正确关键字的正则表达式

Golang正则表达式以匹配关键字对之间的多种模式

匹配正则表达式中不包括关键字的短语

Apify:PseudoUrl正则表达式以匹配包含给定关键字的URL

正则表达式按顺序匹配 2 个分隔的关键字

正则表达式匹配阿拉伯关键字

正则表达式用于多个关键字匹配

正则表达式以匹配静态关键字和变量

正则表达式匹配特定上下文中的关键字

如果后面跟着空格和关键字,则正则表达式跳过匹配

正则表达式匹配特定关键字之间的文本

正则表达式仅匹配整个单词的多个关键字搜索

PHP正则表达式匹配多个关键字,其中last关键字是可选的

基于关键字过滤的正则表达式

与字尾匹配且不是“#”的正则表达式