PHP:正規表示式匹配和替換多個重複匹配的多個實例
P粉738248522
P粉738248522 2024-04-04 15:41:01
0
1
424

我正在尋找為遊戲社群/資料庫編寫一個短代碼系統,用戶可以在其中添加諸如((Magical Sword)) 之類的內容到他們的內容中,它將被解析為指向相關項目的漂亮連結帶有內嵌縮圖。

這是我到目前為止使用的程式碼:

function inlineItems($text) {
    $re = "/\(\(([^)]+)\)\)/m";
    preg_match_all($re, $text, $matches, PREG_SET_ORDER, 0);
    foreach($matches as $match) {
        $slug = makeSlug($match[1]);
        $item = getItem($slug);
        if($item) {
            $text = preg_replace($match[0], '<a class="text-item" data-tooltip="tooltip-item-' . $item->slug . '" href="/items/' . $item->slug .'"><img src="/images/items/' . $item->slug .'.png">' . $item->name .'</a>', $text);
        }
    }
    $text = str_replace("((", "", $text);
    $text = str_replace("))", "", $text);
    return $text;
}

範例輸出,如果使用者輸入 ((Crystal Sword)) 將會是:

<a class="text-item" data-tooltip="tooltip-item-crystal-sword" href="/items/crystal-sword"><img src="/images/items/crystal-sword.png">Crystal Sword</a>

到目前為止一切順利,一切都很好。

但是,當特定匹配項在一個文字字串中重複多次時,就會出現問題。

如果使用者輸入類似:A((水晶劍))對於耕種至關重要,請盡快獲得一把((水晶劍))。 ((水晶劍))是最好的! 然後取代多次符合項目名稱,最終會出現這樣的混亂:

<a class="text-item" data-tooltip="tooltip-item-crystal-sword" href="/items/crystal-sword"><img src="/images/items/crystal-sword.png"></a><a class="text-item" data-tooltip="tooltip-item-crystal-sword" href="/items/crystal-sword"><img src="/images/items/crystal-sword.png"></a><a class="text-item" data-tooltip="tooltip-item-crystal-sword" href="/items/crystal-sword"><img src="/images/items/crystal-sword.png">Crystal Sword</a>

如何防止它像這樣重疊匹配?

P粉738248522
P粉738248522

全部回覆(1)
P粉465675962

你的程式碼相當混亂。你不需要所有這些替換,一個就足夠了。遵循 KISS 原則:

slug}' href='/items/{$item->slug}'>
            
            {$item->name}
        ";

    }, $text);

}


print inlineItems('A ((Crystal Sword)) is essential for farming, get a ((Crystal Sword)) as soon as you can. ((Crystal Sword)) is the best!');
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!