Bonjour,
J'ai un sympathique script de remplacements automatiques dans mes articles :
Bien sûr, ce script étant extrêmement lourd, il tourne grâce à une tâche planifiée.
A priori, il fonctionne très bien, mais il y a un gros problème : quand le script crée un lien sur du texte étant déjà à l'intérieur d'un lien, ça fait un magnifique lien dans un lien ce que je ne veux pas du tout.
Il y a donc deux possibilités :
- Modifier la regex pour qu'elle ne match pas le contenu appartenant déjà à un lien
- Ajouter un bout de script qui supprimerai, une fois l'exécution du script terminé, tous les liens emboités (sachant que le lien à conserver est toujours le premier à avoir été créé).
Dans les deux cas, c'est compliqué et j'ai un peu de peine à voir comment le faire... Bien sûr, la meilleure possibilité serait la deuxième, mais il s'agirait d'une regex très complexe (inutile de me donner de la doc, je la connais !).
Voilà, donc merci d'avance si quelqu'un aurait une solution
J'ai un sympathique script de remplacements automatiques dans mes articles :
Code:
<?php
//Transforme une chaine en regex insensible aux accents. Exemple : Eléphant donne un truc comme (è|e|é|ê|ë|È|É|Ê|Ë)l(è|e|é|ê|ë|È|É|Ê|Ë)ph(a|à|á|â|ã|ä|å|À|Â|Ä|Á)nt
function regexAccents($chaine) {
$accent = array('a','à','á','â','ã','ä','å','À','Â','Ä','Á','c','ç','Ç','e','è','é','ê','ë','È','É','Ê','Ë','i','ì','í','î','ï','Ï','Î','Ì','Í','o','ð','ò','ó','ô','õ','ö','Ô','Ö','Ò','Ó','u','ù','ú','û','ü','Ù','Û','Ü','Ú','y','ý','ý','ÿ','Ý');
$inter = array('%01','%02','%03','%04','%05','%06','%07','%08','%09','%10','%11','%12','%13','%14','%15','%16','%17','%18','%19','%20','%21','%22','%23','%24','%25','%26','%27','%28','%29','%30','%31','%32','%33','%34','%35','%36','%37','%38','%39','%40','%41','%42','%43','%44','%45','%46','%47','%48','%49','%50','%51','%52','%53','%54','%55','%56','%57');
$regex = array('(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)','(a|à|á|â|ã|ä|å|À|Â|Ä|Á)',
'(c|ç|Ç)','(c|ç|Ç)','(c|ç|Ç)',
'(è|e|é|ê|ë|È|É|Ê|Ë)','(è|e|é|ê|ë|È|É|Ê|Ë)','(è|e|é|ê|ë|È|É|Ê|Ë)','(è|e|é|ê|ë|È|É|Ê|Ë)','(è|e|é|ê|ë|È|É|Ê|Ë)','(è|e|é|ê|ë|È|É|Ê|Ë)','(è|e|é|ê|ë|È|É|Ê|Ë)','(è|e|é|ê|ë|È|É|Ê|Ë)','(è|e|é|ê|ë|È|É|Ê|Ë)',
'(i|ì|í|î|ï|Ï|Î|Ì|Í)','(i|ì|í|î|ï|Ï|Î|Ì|Í)','(i|ì|í|î|ï|Ï|Î|Ì|Í)','(i|ì|í|î|ï|Ï|Î|Ì|Í)','(i|ì|í|î|ï|Ï|Î|Ì|Í)','(i|ì|í|î|ï|Ï|Î|Ì|Í)','(i|ì|í|î|ï|Ï|Î|Ì|Í)','(i|ì|í|î|ï|Ï|Î|Ì|Í)','(i|ì|í|î|ï|Ï|Î|Ì|Í)', '(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)','(o|ð|ò|ó|ô|õ|ö|Ô|Ö|Ò|Ó)', '(u|ù|ú|û|ü|Ù|Û|Ü|Ú)','(u|ù|ú|û|ü|Ù|Û|Ü|Ú)','(u|ù|ú|û|ü|Ù|Û|Ü|Ú)','(u|ù|ú|û|ü|Ù|Û|Ü|Ú)','(u|ù|ú|û|ü|Ù|Û|Ü|Ú)','(u|ù|ú|û|ü|Ù|Û|Ü|Ú)','(u|ù|ú|û|ü|Ù|Û|Ü|Ú)','(u|ù|ú|û|ü|Ù|Û|Ü|Ú)',
'(y|ý|ý|ÿ|Ý)','(y|ý|ý|ÿ|Ý)','(y|ý|ý|ÿ|Ý)','(y|ý|ý|ÿ|Ý)','(y|ý|ý|ÿ|Ý)');
$chaine = str_ireplace($accent, $inter, $chaine);//Etape intermédiaire obligatoire, sinon il va y avoir une imbrication des remplacements quasi-infinie, chaque remplacement créant de nouveaux remplacements à faire.
$chaine = str_replace($inter, $regex, $chaine);
return $chaine;
}
//Remplace automatiquement tout ce qui doit être remplaçé dans un champ texte sur le site (ajout de liens automatiques,...). Long temps de chargement donc à utiliser avec modération
function auto_replace($contenu)
{
$requete = mysql_query('SELECT * FROM donjons WHERE dj_actif = 1');
while ($res = mysql_fetch_array($requete))
{
$contenu= preg_replace("#(\b|>)". regexAccents(preg_quote($res['dj_nom'], "#"))."(?![^<]*>)\b#i", '$1<a href="/'.$res['dj_type'].'s/'.caract_spec($res['dj_nom']).'-'.$res['dj_id'].'.html">'.$res['dj_nom'].'</a>', $contenu);
}
$requete = mysql_query('SELECT * FROM donjons WHERE dj_actif = 1 AND dj_type="donjon"');
while ($res = mysql_fetch_array($requete))
{
$contenu= preg_replace("#(\b|>)". regexAccents(preg_quote($res['dj_boss'], "#"))."(?![^<]*>)\b#i", '$1<a href="/'.$res['dj_type'].'s/'.caract_spec($res['dj_nom']).'-'.$res['dj_id'].'.html">'.$res['dj_boss'].'</a>', $contenu);
}
$requete = mysql_query('SELECT * FROM armes');
while ($res = mysql_fetch_array($requete))
{
$contenu= preg_replace("#(\b|>)". regexAccents(preg_quote($res['a_nom'], "#"))."(?![^<]*>)\b#i", '$1<a href="/'.caract_spec($res['a_nom']).'-a'.$res['a_id'].'">'.$res['a_nom'].'</a>', $contenu);
}
$requete = mysql_query('SELECT * FROM remplacements')or die(mysql_error());
while ($res = mysql_fetch_array($requete))
{
$contenu= preg_replace("#(\b|>)". regexAccents(preg_quote($res['rep_search'], "#"))."(?![^<]*>)\b#i", "$1" . $res['rep_replace'], $contenu);
}
$contenu = preg_replace("@(^|\s)(https?://)?((www\.)?[a-z0-9\-]{2,30}\.[a-z]{2,4}(/.*)*)(\s|$)@i", "<a href=\"http://$3\">$0</a>",$contenu);
return $contenu;
}
?>
Bien sûr, ce script étant extrêmement lourd, il tourne grâce à une tâche planifiée.
A priori, il fonctionne très bien, mais il y a un gros problème : quand le script crée un lien sur du texte étant déjà à l'intérieur d'un lien, ça fait un magnifique lien dans un lien ce que je ne veux pas du tout.
Il y a donc deux possibilités :
- Modifier la regex pour qu'elle ne match pas le contenu appartenant déjà à un lien
- Ajouter un bout de script qui supprimerai, une fois l'exécution du script terminé, tous les liens emboités (sachant que le lien à conserver est toujours le premier à avoir été créé).
Dans les deux cas, c'est compliqué et j'ai un peu de peine à voir comment le faire... Bien sûr, la meilleure possibilité serait la deuxième, mais il s'agirait d'une regex très complexe (inutile de me donner de la doc, je la connais !).
Voilà, donc merci d'avance si quelqu'un aurait une solution