Problème avec une expression régulière ereg_replace

julien__

WRInaute occasionnel
Bonjour, j'ai un problème avec une expression régulière que je n'arrive pas à mettre sur pieds...

Le but :

Transformer dans un texte des noms en liens.

Le texte :

Ceci est un texte d'exemple avec des noms propres, comme [p]Sébastien Rittout[/p] ou d'autres qui peuvent apparaître n'importe ou dans le texte [p]José Rigou[/p].

Les noms de personnes sont encadrée par des balises genre BBCode, tous les nom ont la balise [p] au début et la balise [/p] pour les terminer.

Voilà la transformation que je devrais arriver à faire :

[p]Jean-Paul Nicod[/p]

en

<a href="http://www.nomdedomaine.com/personne,jean-paul_nicod">Jean-Paul Nicod</a>

et ceci bien sûr avec n'importe quel nom, et toutes les occurrences dans le texte.

Pour remplacer les majuscules et les caractères spéciaux par leur équivalent, je me sert de cette fonction.

$chaine = strtolower(strtr($nom,"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ' ","aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn-_"));

cela a pour effet de mettre le nom en minuscule et de remplacer les caractères spéciaux pour l'url rewriting.

Maintenant le but, c'est d'avoir une fonction, capable :

1. de mettre en miniuscule
2. de remplacer les caractères spéciaux par leur équivalent é en e etc...
3. et de transformer en lien

J'ai pensé à ereg_replace

Mais les caractères [] sont utilisés dans les expressions régulières pour délimiter des suites de caractères, il faut en plus y ajouter des caractères d'échappement. Je ne m'en sors pas!!!

Si quelqu'un a la science infuse des expressions régulières, cela m'aiderait grandement...
 

seebz

WRInaute impliqué
Essaye ça :
Code:
$str = preg_replace(
	'`\[p\](.+)\[\/p\]`Ue', 
	'"<a href=\"http://www.nomdedomaine.com/personne," . to_permalink("\\1") . "\">\\1</a>"',
	$str
);

function to_permalink($str)
{
	if($str !== mb_convert_encoding( mb_convert_encoding($str, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32') )
		$str = mb_convert_encoding($str, 'UTF-8');
	$str = htmlentities($str, ENT_NOQUOTES, 'UTF-8');
	$str = preg_replace('`&([a-z]{1,2})(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig);`i', '\\1', $str);
	$str = html_entity_decode($str, ENT_NOQUOTES, 'UTF-8');
	$str = preg_replace(array('`[^a-z0-9]`i','`[_]+`'), '_', $str);
	$str = strtolower( trim($str, '_') );
	return $str;
}

ereg_replace est déprécié, autant directement utiliser preg_replace.
Le code ci-dessus utilise ma 'tite fonction to_permalink() légèrement modifiée pour convenir à ton besoin.

J'espère que ca conviendra ;)
 

julien__

WRInaute occasionnel
Si ça me convient??? C'est la classe :D ou plutôt devrais-je dire la fonction!

Je suis épaté ça marche vite, bien et sans bug, j'ai déjà testé avec tous les cas de figure et caractères spéciaux...

Un très très grand merci, cela faisait un moment déjà que je devais résoudre ce problème pour pouvoir avancer mieux et bien dans mes projets...

Tu dois avoir beaucoup d'amis? :)
 

Discussions similaires

Haut