Salut tout le monde !
J'ai un soucis avec un remplacement de caractères dans le pattern d'une regex ! (j'ai rien trouvé là dessus, j'espère ne pas faire un doublon sur le forum)
En fait j'ai une fonction qui va faire un preg_match selon les paramètres qu'on lui passe, comme ça :
1 2 3 4
| function remove_item($chaine, $str_to_remove){
preg_match("`".EMPTY_PATTERN.$str_to_remove.EMPTY_PATTERN."(.*$)`is", $chaine, $out);
return is_array($out) && count($out)>0 ? delete_empty_tags(str_replace($out[0],'',$chaine),end($out)) : $chaine;
} |
Explication : delete_empty_tags est une fonction à moi qui ne pose pas de problème, et la constante EMPTY_PATTERN est préalablement définie :
define('EMPTY_PATTERN','(\s*<br[^>]*>\s*|\s*<hr[^>]*>\s*|( )*)*');
Exemple :
Appel de la fonction : remove_item('blabla1 <strong> Ref </strong> blabla2', 'ref');
Retour : 'blabla1 blabla2'
la chaine 'ref' a été virée dans la fonction remove_item, et la balise <strong> s'est retrouvée vide, elle a été jetée dans la fonction delete_empty_tags.
Donc ça, ça marche.
Le truc, c'est que dans $str_to_remove je veux qu'il ne prenne pas en compte les accents. C'est là que ça commence à cafouiller*.
Alors pour l'exemple je me concentre sur les e. J'ai fait ça :
1 2 3 4 5 6
| function remove_item($chaine, $str_to_remove){
$str_to_remove=preg_quote($str_to_remove); // Au passage, on protège la chaine
$str_to_remove=preg_replace('`[eéèêë]`is','[eéèêë]',$str_to_remove); // Là c'est ce que j'ai fait pour remplacer les e (accentués ou non) par la chaine "[eéèêë]"
preg_match("`".EMPTY_PATTERN.$str_to_remove.EMPTY_PATTERN."(.*$)`is", $chaine, $out);
return is_array($out) && count($out)>0 ? delete_empty_tags(str_replace($out[0],'',$chaine),end($out)) : $chaine;
} |
(dans le vrai code la fonction fait 2 lignes, là j'ai développé pour une meilleure compréhension, ça ne change rien)
Voilà c'est le mieux que je peux sortir de ma tête pour le moment ^^ Mais ça marche pas
Si je reprends mon exemple du dessus, avec cet appel :
remove_item('blabla1 <strong> Ref </strong> blabla2', 'ref');
Là c'est toujours ok.
Mais si je mets un accent comme ça :
remove_item('blabla1 <strong> Réf </strong> blabla2', 'ref');
Là aucun résultat n'est trouvé avec le preg_match. Pourtant j'ai bien vérifié, la variable $str_to_remove, elle passe bien de 'ref' à 'r[eéèêë]f'.
Alors pourquoi preg_match ne trouve rien ????
Merci d'avance pour votre aide !
* Je sais que le mot 'cafouiller' ne s'emploie plus depuis 1912 (environ), j'avais pensé à mettre le mot 'merder' mais ça fait vulgaire et nous sommes sur un forum sérieux ici.
Partager