簡體   English   中英

正則表達式排除被特殊字符包圍的單詞

[英]Regex expression to exclude words surrounded by special characters

我一直在為我遇到的正則表達式難題尋找解決方案。

最近,我參與了一個項目,我們需要將給定文本中的單詞列表替換為錨標簽列表。

例如,給定一個字符串

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>

目前,我正在尋找一個與任何被特殊字符包圍的單詞都不匹配的正則表達式,因為我認為這可以解決我的問題。

對如何解決這個問題的任何其他想法也非常開放

這不僅僅是關於以前的替換:標簽屬性/名稱/值中出現的任何單詞都是一個問題。

換句話說,您想替換某些字符后面的字符串,其中 next < 出現在 next > 之前(標簽之間的字符串而不是標簽內的字符串)

因此試試這個 : (string-to-match)(?=[^>]*?<)

(顯然,替換字符串匹配)

另一個塊是前瞻:它確保您可以讀取任何字符但 >,根據需要多次,然后是 <

嘗試 :

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

我發現了一個非常適合我聽到$pattern = '/(?<!(>|\\/|-))\\b' . preg_quote($stringToReplace, '/') . '\\b(?!(<|\\/|-))/i'; $pattern = '/(?<!(>|\\/|-))\\b' . preg_quote($stringToReplace, '/') . '\\b(?!(<|\\/|-))/i';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM