Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/04/2006, 18h06   #1
Membre éprouvé
 
Avatar de GregPeck
 
Inscription : novembre 2005
Messages : 530
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 530
Points : 464
Points : 464
Par défaut Regex

Bonjour à tous,

Je viens de faire un site pour un client.
Ce site contient plein de news, d'articles et un lexique.
Ce lexique contient les définitions de plusieurs mots (domaine de la voile).
J'ai donc une table lexique contenant les mots et leurs définitions.

Le but du lexique est de faire un lien sur chaque mot d'un article présent dans le lexique vers la page explicative

Dans l'exemple ci dessous, $RowSQLArt['art_texte'] contient le texte de mes articles, voici comment je fait pour faire mes liens:

Code :
1
2
3
4
5
6
7
$sql = "SELECT * FROM lexique";
$SQL = mysql_query($sql) or die(mysql_error());
$RowSQL = mysql_fetch_assoc($SQL);
 
do {
	$RowSQLArt['art_texte'] = preg_replace("!(".$RowSQL['lex_id'].")!i", "<a class='lexique' href='/lexique-de-la-voile.html#".$RowSQL['lex_id']."' title='".htmlentities($RowSQL['lex_des'])."'>$1</a>", $RowSQLArt['art_texte']);			
} while ($RowSQL = mysql_fetch_assoc($SQL));
Seulement les articles contiennent du HTML (liens, etc...).
Donc si un article contient un lien
Code :
<a href='http://www.voile.com'>
et que "voile" est un mot présent dans le lexique, ca me le transforme en:
Code :
<a href='http://www.<a class='lexique' href='/lexique-de-la-voile.html#voile' title='blabla'>voile</a>.com'>
C'est pas beau à voir ...

Quelqu'un à une idée de fonctionnement qui corrigerais le problème ?

Merci !
GregPeck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 22h15   #2
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
dans ton regexp, tu pourrais faire un truc qui prend les mots qui sont entourés d'ESPACE, de VIRGULE, ou de POINT ... un truc comme ca.

ou avec le fait que si le Mot y a un < a gauche et > a droite c'est que c'est un lien.

tu en penses quoi ??
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2006, 23h22   #3
Membre éprouvé
 
Avatar de GregPeck
 
Inscription : novembre 2005
Messages : 530
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 530
Points : 464
Points : 464
La deuxieme solution me parait parfaite !!

Seulement je suis une biquette en expressions régulieres et j'ai bien passé 2h à pondre celle ci, donc si il y a une âme charitable qui ère sur le forum...
GregPeck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2006, 13h19   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Il me semble que ce genre de question (une regex qui remplace tout sauf ce qui est dans des tags HTML) a déjà été abordée plusieurs fois, si tu vois ce que je veux dire ^^
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2006, 13h55   #5
Membre éprouvé
 
Avatar de GregPeck
 
Inscription : novembre 2005
Messages : 530
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 530
Points : 464
Points : 464
Tu as entierement raison...

C'est que je n'avais pas formulé mom problème comme "une regex qui remplace tout sauf ce qui est dans des tags HTML"

Dis comme ça, je pense que je vais trouver mon bonheur !

EDIT: J'ai trouvé (notamment plusieurs où tu as donné des soluces). Merci !
GregPeck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2006, 14h42   #6
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
tu peux poster le code pour voir à quoi ca ressemble ...
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2006, 14h44   #7
Membre éprouvé
 
Avatar de GregPeck
 
Inscription : novembre 2005
Messages : 530
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 530
Points : 464
Points : 464
J'ai trouvé ça:
Code :
1
2
3
4
5
function split_balise($on_recherche, $on_remplace, $subject, 'str_replace', $flag = 1)
{
   $eval_fct = "mon_rplc('\$1', '\$2', \$de, \$par, '$fct', '$flag')";
   return preg_replace('#((?:(?!<[/a-z]).)*)([^>]*>|$)#ies', $eval_fct, $txt);
}
ou ça:

Code :
1
2
3
4
5
6
7
8
//Le ou les mots clé, séparé par des |
$kw="le|la";
 
//Essaie #1:
SubstituteText("(?(?=^)^([^<]*?)(".$kw.")([^<]*?)|(?=>)([^<]*?)(".$kw.")(.*?)?)","\\1\\4<span id=\"hlzone\" style=\"background-color:#DDDD00;\">\\2\\5</span>\\3\\6",$vlTmp,0x0401);
 
//Essaie #2:
SubstituteText ("(".$kw.")*(?(?=<)(<[^>]*>))(".$kw.")*";"<span id=\"hlzone\" style=\"background-color:#DDDD00;\">\\1\\3</span>\\2",$vlTmp,0x0401);
Mais je n'ai pas encore testé...
GregPeck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2006, 23h55   #8
Membre éprouvé
 
Avatar de GregPeck
 
Inscription : novembre 2005
Messages : 530
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 530
Points : 464
Points : 464
Si ça interesse quelqu'un, voici le code qui fonctionne (pompé chez un concurrent )


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function mon_rplc_callback($capture){
	  global $arg;
	  return ($arg['flag'] == 1)
	  ? $arg['fct']($arg['de'], $arg['par'], $capture[1]).$capture[2] : $capture[1].$arg['fct']($arg['de'], $arg['par'], $capture[2]);
}
 
function split_balise($de, $par, $txt, $fct, $flag = 1){
	  global $arg;
	  $arg = compact('de', 'par', 'fct', 'flag');
	  return preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', "mon_rplc_callback", $txt);
}
 
 
$sql = "SELECT * FROM lexique";
$SQL = mysql_query($sql) or die(mysql_error());
$RowSQL = mysql_fetch_assoc($SQL);
do {
	$RowSQLArt['art_texte'] =  split_balise("!(".$RowSQL['lex_id'].")!i", "<a accesskey='' class='lexique' href='/lexique-de-la-voile.html#".$RowSQL['lex_id']."' title='".strip_tags($RowSQL['lex_des'])."'>$1</a>", $RowSQLArt['art_texte'], 'preg_replace', 1); 
} while ($RowSQL = mysql_fetch_assoc($SQL));
GregPeck est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h04.


 
 
 
 
Partenaires

Hébergement Web