Ich möchte ein Shortcode-System für eine Gaming-Community/-Datenbank schreiben, in dem Benutzer so etwas wie ((Magical Sword))
zu ihren Inhalten hinzufügen können und es in einen schönen Link zum zugehörigen Element mit einem Inline-Thumbnail umgewandelt wird.
Das ist der Code, den ich bisher verwende:
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; }
Beispielausgabe, wenn der Benutzer ((Crystal Sword))
eingegeben hätte, wäre:
<a class="text-item" data-tooltip="tooltip-item-crystal-sword" href="/items/crystal-sword"><img src="/images/items/crystal-sword.png">Crystal Sword</a>
So weit, so gut, so gut.
Allerdings treten Probleme auf, wenn eine bestimmte Übereinstimmung innerhalb einer Textzeichenfolge mehrmals wiederholt wird.
Wenn der Benutzer etwa Folgendes eingibt: A((水晶剑))对于耕种至关重要,请尽快获得一把((水晶剑))。 ((水晶剑))是最好的!
und dann mehrere übereinstimmende Artikelnamen ersetzt, entsteht ein Durcheinander wie dieses:
<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>
Wie kann verhindert werden, dass sich solche Übereinstimmungen überschneiden?
你的代码相当混乱。你不需要所有这些替换,一个就足够了。遵循 KISS 原则: