PHP: Ungkapan biasa untuk memadankan dan menggantikan berbilang kejadian berbilang padanan pendua
P粉738248522
P粉738248522 2024-04-04 15:41:01
0
1
592

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?

P粉738248522
P粉738248522

membalas semua(1)
P粉465675962

Kod anda agak mengelirukan. Anda tidak memerlukan semua penggantian ini, satu sudah cukup. Ikut prinsip 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!');
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan