我正在寻找为游戏社区/数据库编写一个短代码系统,用户可以在其中添加诸如 ((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粉4656759622024-04-05 11:05:47
你的代码相当混乱。你不需要所有这些替换,一个就足够了。遵循 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!');