我一直在寻找解决我遇到的正则表达式难题的问题。最近,我从事一个项目,我们需要用锚标签列表替换给定文本中的单词列表。例如,给定一个字符串This is a test string我可能想将“测试”一词替换为<a target="_blank" href="https://website.com/string-random“>test</a>. 结果字符串应如下所示This is a <a target="_blank" href="https://website.com/string-random“>test</a> string单词的替换是循环完成的foreach ($documents as $document)
foreach ($links as $link) replace keywords在某些情况下最终会发生的是锚标记中的一些 url 包含可能被替换的单词例如,给定这个要替换的单词列表
[ { 'keyword': 'test', 'link': 'https://website.com/string-random' }, { 'keyword': 'string', 'link': 'https://random.com/string' }]完成所有替换后,我上面给出的示例字符串将如下所示
This is a <a target="_blank" href="https://website.com/<a target="_blank" href="https://random.com/string“>string</a>-random“>test</a> <a target="_blank" href="https://random.com/string“>string</a>代替This is a <a target="_blank" href="https://website.com/string-random“>test</a> <a target="_blank" href="https://random.com/string“>string</a>目前,我正在寻找一个与特殊字符包围的任何单词都不匹配的正则表达式,因为我认为这可以解决我的问题。对于如何解决这个问题的任何其他想法也非常开放
3 回答

斯蒂芬大帝
TA贡献1827条经验 获得超8个赞
我发现了一种对我来说效果很好的模式 $pattern = '/(?<!(>|\/|-))\b' . preg_quote($stringToReplace, '/') . '\b(?!(<|\/|-))/i';

SMILET
TA贡献1796条经验 获得超4个赞
这不仅仅是以前的替换:标签属性/名称/值中出现的任何单词都是一个问题。
换句话说,您想要替换一些字符后面的字符串,其中下一个 < 出现在下一个 > 之前(标签之间的字符串而不是标签内的字符串)
因此尝试这个: (string-to-match)(?=[^>]*?<)
(显然,替换字符串以匹配)
另一个块是前瞻:它确保您可以读取除 > 之外的任何字符,根据需要多次读取,然后是 <

慕勒3428872
TA贡献1848条经验 获得超6个赞
尝试 :
foreach ($wordlist as $word){
$document = preg_replace("~(?! )($word[keyword])(?! )~i","<a href='$word[link]'>$1<")
}
- 3 回答
- 0 关注
- 135 浏览
添加回答
举报
0/150
提交
取消