preg_replace排除<a href="" '=""></a> PHP

时间:2018-11-20 15:18:50

标签: php regex replace preg-replace

我正在使用preg_replace替换带有href标签的文本中的关键字,我的正则表达式工作非常好,现在我的代码是:

$newstring2 = preg_replace("/\p{L}*?".preg_quote($match[$i])."\p{L}*/ui", "<a href='".$url."' class='link'>$0</a>", $newstring);

唯一的问题是,我需要排除<a href='https://keyword.cz' title="keyword">keyword</a>内的所有关键字

这就是我发现的https://stackoverflow.com/a/22821650/4928816

那么有人可以帮助我将这两个正则表达式合并在一起吗?

示例:

$text = 'this is sample text about something what is text.'
$keyword = 'text'

现在由于我的正则表达式,我得到了:

$text= 'this is sample <a href='somelink.php'>text</a> about something what is <a href='somelink.php'>text</a>.'

但是如果文字是:

$text= 'this is sample <a href='text.php'>text</a> about something what is <a href='somelink.php'>text</a>.'

例如,这就是我得到的:

$text= 'this is sample <a href='<a href='somelink.php'>text.php</a>'><a href='somelink.php'>text</a></a> about something what is <a href='somelink.php'><a href='somelink.php'>text</a></a>.'

更新: 我为什么需要这个。 正在使用功能将特定博客帖子中的所有关键字替换为特定URL,该特定博客帖子已包含标签。 例如

$keyword = 'key';

我需要查找整个世界并将其替换为href标签,例如: 具有UNICODE支持的键,关键字,关键字,键锁,mykey,键或KeY,关键字

2 个答案:

答案 0 :(得分:3)

前瞻性为负的情况如何。 Regex

说明:捕获所有名为text的关键字并替换为某些链接,但捕获具有{{1} }。

</a>

输出:

$re = '/(text)(?!<\/a>)/m';
$str = 'this is sample text about something what is text.

this is sample <a href=\'somelink.php\'>text</a> about something what is <a href=\'somelink.php\'>text</a>.';
$subst = '<a href=\'somelink.php\'>$1</a>';

$result = preg_replace($re, $subst, $str);

echo $result;

演示: https://3v4l.org/DVTB1

答案 1 :(得分:1)

如果必须使用正则表达式,我认为PCRE动词是您的最佳选择。排除所有链接,然后搜索带有单词边界的术语。

<a[\S\s]+?<\/a>(*SKIP)(*FAIL)|\bTERM\b

演示:https://regex101.com/r/KlE1kc/1/

一个有缺陷的例子是a曾经有一个</a>。例如onclick='write("</a>")'解析器确实是最好的方法。 HTML和正则表达式有很多陷阱。