retirer espace dans un regex

a marqué ce sujet comme résolu.

Voici mon petit soucis : j'utilise une fonction qui me permet de rechercher dans un texte les mots présent dans le dictionnaire. Il les trouve et les remplace par un lien pointant vers la définition du mot via un preg_replace, jusqu'ici pas de souci.

Mais il se trouve des mots avec des espaces ou accent. Le problème c'est que je n'arrive pas à implémenter une fonction correcte qui me permettrait d'éliminer accent et espace afin de rendre le lien correcte !

Voici ma fonction :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function glossaire($mots,$chaine)
//met un lien sur les mots trouvés
{

$motif='#\b('.implode('|',$mots).')s?\b#';

$sortie="<a href='http://www.seconde-guerre.com/glossaire-$0.html' class='lien'>$0</a>";
echo preg_replace($motif,$sortie,$chaine);

}

le mot entre les balises <a href> est correcte, mais le lien qui renvoie est le même et donc avec accent ou espace quand il y en a ce qui fait que cela me donne une belle erreur 404.

donc finalement comment faire ?

Merci d'avance à tous ceux qui m'aideront.

Cordialement.

+0 -0

Salut secondeguerrecom !

Pour les espaces, je pense que tu dois traiter les mots avant de les injecter dans le motif. D'ailleurs, tu dois remplacer par quoi ces espaces ?

Pour ce qui est de n'avoir plus que des caractères non accentués, la manière la plus simple que je connaisse est d'utiliser la fonction iconv(). Si tu as une version de PHP suffisamment récente (minimum 5.4, avec intl d'activé et icu d'installé), il existe la classe Transliterator.

+0 -0

Ce code match 'un' et le remplace par 'le'.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    $line = "un mot";

    $line = preg_replace_callback(
        '|un|',
        function ($matches) {
            return str_replace('un', 'le', $matches[0]);
        },
        $line
    );

    echo $line;
+0 -0

Bonsoir,

votre exemple fonctionne très bien. Merci.

J'ai essayé en le changeant pour mon script malheureusement le texte ne change pas.

voici mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$chaine = "un luftwaffe de la task force chez les bolchevique";
$mots = array("luftwaffe","bolchevique","task force");

$motif='#\b('.implode('|',$mots).')s?\b#';

    $chaine = preg_replace_callback(
        '#$motif#',
        function ($matches) {
            return str_replace(' ', '', $matches[0]);
        },
        $chaine
    );

    echo $chaine;

mille merci

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte