PHP : expression régulière pour faire correspondre et remplacer plusieurs instances de plusieurs correspondances en double
P粉738248522
P粉738248522 2024-04-04 15:41:01
0
1
425

Je cherche à écrire un système de shortcode pour une communauté/base de données de jeux où les utilisateurs peuvent ajouter quelque chose comme ((Magical Sword)) à leur contenu et il sera analysé en un joli lien vers l'élément associé avec une vignette en ligne.

Voici le code que j'utilise jusqu'à présent :

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;
}

Exemple de résultat, si l'utilisateur saisit ((Crystal Sword)) serait :

<a class="text-item" data-tooltip="tooltip-item-crystal-sword" href="/items/crystal-sword"><img src="/images/items/crystal-sword.png">Crystal Sword</a>

Jusqu’ici tout va bien, tout va bien.

Cependant, des problèmes surviennent lorsqu'une correspondance spécifique est répétée plusieurs fois dans une chaîne de texte.

Si l'utilisateur saisit quelque chose comme : A((水晶剑))对于耕种至关重要,请尽快获得一把((水晶剑))。 ((水晶剑))是最好的! puis remplace plusieurs noms d'éléments correspondants, vous vous retrouverez avec un désordre comme celui-ci :

<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>

Comment éviter que des matchs se chevauchent comme celui-ci ?

P粉738248522
P粉738248522

répondre à tous(1)
P粉465675962

Votre code est assez déroutant. Vous n’avez pas besoin de tous ces remplacements, un seul suffit. Suivez le principe 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!');
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!