cari

Rumah  >  Soal Jawab  >  teks badan

PHP: Ungkapan biasa untuk memadankan dan menggantikan berbilang kejadian berbilang padanan pendua

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粉738248522P粉738248522265 hari yang lalu641

membalas semua(1)saya akan balas

  • P粉465675962

    P粉4656759622024-04-05 11:05:47

    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!');
    

    balas
    0
  • Batalbalas