我正在使用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,关键字
答案 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;
答案 1 :(得分:1)
如果必须使用正则表达式,我认为PCRE动词是您的最佳选择。排除所有链接,然后搜索带有单词边界的术语。
<a[\S\s]+?<\/a>(*SKIP)(*FAIL)|\bTERM\b
演示:https://regex101.com/r/KlE1kc/1/
一个有缺陷的例子是a
曾经有一个</a>
。例如onclick='write("</a>")'
解析器确实是最好的方法。 HTML和正则表达式有很多陷阱。