retirer espace dans un regex

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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.

Édité par Coyote

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

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

Merci pour la réponse

Si je traite les mots avant il ne trouvera plus les mots avec accent ou avec espace.

Et j'aimerais que les mot sans espace soit collés exemple : task force devient taskforce, mais uniquement le lien pas ce que l'on voit :)

Merci

+0 -0
Auteur du sujet

Re bonjour est-ce que quelqu'un pourrait m'aider via un exemple ou en réutilisant mon code parce que là, je nage complètement, je dirais même que je coule !

D'avance je vous remercie mille fois de vos réponse et de votre patience.

+0 -0
Staff

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;

Je parle de JavaScript et d'autres trucs sur mon blog : https://draft.li/blog

+0 -0
Auteur du sujet

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

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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