【问题标题】:Regex expression to exclude words surrounded by special characters正则表达式排除被特殊字符包围的单词
【发布时间】:2020-02-29 18:34:06
【问题描述】:

我一直无法找到解决我遇到的正则表达式难题的方法。

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

例如,给定一个字符串

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>

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

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

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    这不仅仅是以前的替换:标签属性/名称/值中出现的任何单词都是一个问题。

    换句话说,您想替换一些字符后面的字符串,其中下一个 之前(标签之间的字符串而不是标签内的字符串)

    因此试试这个: (string-to-match)(?=[^&gt;]*?&lt;)

    (显然,替换字符串以匹配)

    另一个块是前瞻:它确保您可以读取任何字符,但>,根据需要多次,然后是

    【讨论】:

      【解决方案2】:

      试试:

      foreach ($wordlist as $word){
           $document = preg_replace("~(?! )($word[keyword])(?! )~i","<a href='$word[link]'>$1<")
      }
      

      【讨论】:

        【解决方案3】:

        我发现了一个非常适合我的模式 $pattern = '/(?&lt;!(&gt;|\/|-))\b' . preg_quote($stringToReplace, '/') . '\b(?!(&lt;|\/|-))/i';

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多