Saya sedang mencari untuk menulis sistem kod pendek untuk komuniti/pangkalan data permainan di mana pengguna boleh menambahkan sesuatu seperti ((Magical Sword))
pada kandungan mereka dan ia akan dihuraikan menjadi pautan yang bagus ke item yang berkaitan dengan lakaran kecil sebaris.
Ini kod yang saya gunakan setakat ini:
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; }
Contoh output, jika pengguna memasukkan ((Crystal Sword))
ialah:
<a class="text-item" data-tooltip="tooltip-item-crystal-sword" href="/items/crystal-sword"><img src="/images/items/crystal-sword.png">Crystal Sword</a>
Setakat ini bagus, sangat bagus.
Walau bagaimanapun, masalah timbul apabila padanan tertentu diulang beberapa kali dalam rentetan teks.
Jika pengguna memasukkan sesuatu seperti: A((水晶剑))对于耕种至关重要,请尽快获得一把((水晶剑))。 ((水晶剑))是最好的!
dan kemudian menggantikan berbilang nama item yang sepadan, anda akan mengalami kekacauan seperti ini:
<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>
Bagaimana untuk mengelakkannya daripada bertindih padanan seperti ini?
Kod anda agak mengelirukan. Anda tidak memerlukan semua penggantian ini, satu sudah cukup. Ikut prinsip KISS: