正则表达式排除被特殊字符包围的单词

我一直在寻找解决我遇到的正则表达式难题的问题。


最近,我从事一个项目,我们需要用锚标签列表替换给定文本中的单词列表。


例如,给定一个字符串


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>

目前,我正在寻找一个与特殊字符包围的任何单词都不匹配的正则表达式,因为我认为这可以解决我的问题。


对于如何解决这个问题的任何其他想法也非常开放


绝地无双
浏览 136回答 3
3回答

斯蒂芬大帝

我发现了一种对我来说效果很好的模式&nbsp;$pattern = '/(?<!(>|\/|-))\b' . preg_quote($stringToReplace, '/') . '\b(?!(<|\/|-))/i';

SMILET

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

慕勒3428872

尝试 :foreach ($wordlist as $word){&nbsp; &nbsp; &nbsp;$document = preg_replace("~(?! )($word[keyword])(?! )~i","<a href='$word[link]'>$1<")}
打开App,查看更多内容
随时随地看视频慕课网APP