Problème REGEX particulière

Eléphanteau du PHP | 10 Messages

05 nov. 2010, 17:53

Bonjour,

J'ai en fait besoin d'une REGEX assez particulière pour l'intégrer dans un preg_replace.

Voici mon code actuel :

Code : Tout sélectionner

$remplacement1 = '#\'^[^<>(=")]\'(' . $donnees2['nom'] . ')#i'; $donnees = preg_replace ('' . $remplacement1 . '', '<a href="../quetes/' . $donnees2['nom_sans_caract_speciaux'] . '.htm>' . $1 . '</a>', $donnees );
Il ne fonctionne pas et la page ne se charge pas du tout avec, il doit sûrement y avoir une erreur de syntaxe.

J'ai donc deux questions :
- Quelle est l'erreur de syntaxe ?
- Que veut dire, selon vous, cette Regex ? Il ne me semble pas qu'elle soit correcte, et j'attend, avant de vous dire ce que j'attend d'elle, de savoir comment vous l'interprétez.

Merci d'avance,

7804j

ViPHP
ViPHP | 5462 Messages

05 nov. 2010, 18:01

il a pas l'air bon le truc, ta un de phrase j'ai l'impression que le premier ^ est de trop et les \' c'est un peu bizarre

ViPHP
ViPHP | 4039 Messages

05 nov. 2010, 18:19

- Quelle est l'erreur de syntaxe ?
S'il y en à une, Php devrait la signaler. Si php ne signale rien, c'est soit qu'il est mal configuré, soit qu'il n'y a pas d'erreurs de syntaxe.
-Que veut dire, selon vous, cette Regex ? Il ne me semble pas qu'elle soit correcte, et j'attend, avant de vous dire ce que j'attend d'elle, de savoir comment vous l'interprétez.
Je l'interprète comme venant de quelqu'un n'y connaissant pas grand chose en expressions régulières.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 10 Messages

05 nov. 2010, 18:32

Voici ce que me dit PHP, qui ne m'avance pas à grand chose, peut-être y comprendras-tu mieux : Parse error: syntax error, unexpected T_LNUMBER, expecting T_VARIABLE or '$' in /home/dofusorg/public_html/quetes/quetes.php on line 35

J'ai modifié mon code comme ceci, mais il ne fonctionne toujours pas :

Code : Tout sélectionner

$remplacement1 = '#[^<>(=")](' . $donnees2['nom'] . ')#i'; $donnees = preg_replace ('' . $remplacement1 . '', '<a href="../quetes/' . $donnees2['nom_sans_caract_speciaux'] . '.htm>' . $1 . '</a>', $donnees );

Eléphant du PHP | 275 Messages

05 nov. 2010, 18:57

$remplacement1 = '#[^<>\(="\)](' . preg_quote($donnees2['nom'], '#') . ')#i';
$donnees = preg_replace($remplacement1, '<a href="../quetes/' . $donnees2['nom_sans_caract_speciaux'] . '.htm>\\1</a>', $donnees );
Et donc, ta regexp remplace $donnees2['nom'] précédé d'un caractère quelquonque (hors <>(=")) pour le wrapper dans un lien vers ../quetes/' . $donnees2['nom_sans_caract_speciaux'] . '.htm

Eléphanteau du PHP | 10 Messages

05 nov. 2010, 19:15

Ton code détecte effectivement $donnees2['nom'], mais il transforme tout ce qui suit sur la page en lien géant. Je pense donc qu'il y a un bug.

De plus, j'avais mis $1 pour que la partie visible du lien soit la même que ce qui a été remplacé, mais tu l'as modifié :/

Eléphant du PHP | 275 Messages

05 nov. 2010, 19:19

Mais tu veux faire quoi en fait ?

Et ton $1 ne servais a rien la ou il était.

Eléphanteau du PHP | 10 Messages

05 nov. 2010, 19:32

J'ai des articles, et j'aimerais repérer toute une série de mots pour pouvoir les transformer en lien vers d'autres articles (comme wikipedia).

Tu avais très bien compris ce que je voulais faire, mais ton code ne fonctionnait pas, il transformait tout ce qui suit le mot en question en lien (donc ne fermait pas la balise </a>) ;)

Eléphant du PHP | 275 Messages

05 nov. 2010, 19:38

Dans ce cas il sers a quoi ton [^<>\(="\)] ?

Eléphant du PHP | 275 Messages

05 nov. 2010, 19:39

lol, j'ai vu l'erreur. En fait, c'est toi qui a oublié le " fermant après l'url.
$donnees = preg_replace(
	'/' . preg_quote($donnees2['nom'], '/') . '/i',
	'<a href="../quetes/' . $donnees2['nom_sans_caract_speciaux'] . '.htm">' . $donnees2['nom'] .'</a>',
	$donnees
);
 

Eléphanteau du PHP | 10 Messages

05 nov. 2010, 20:41

Ouf !!! Merci !!

J'ai demandé ça sur plusieurs forums, mais je suis content que tu aies finalement réussi à m'aider :)

ViPHP
ViPHP | 5462 Messages

05 nov. 2010, 20:43

du coup pourquoi pas faire un simplement str_replace ???

Eléphant du PHP | 275 Messages

08 nov. 2010, 11:30

parce que /i ? Du coup str_ireplace serait mieux adapté.

ViPHP
ViPHP | 5462 Messages

08 nov. 2010, 11:38

oui, ou si il cherche a remplacer un mot et non pas une chaine, il va falloir utiliser la limite du mot (\b) dans le regexp

Eléphanteau du PHP | 10 Messages

08 nov. 2010, 17:44

En fait, j'aurai une autre question concernant les REGEX.

Il me faudrait une REGEX qui cherche, dans un gros texte, toutes les occurrence de $donnees['nom'] qui ne sont PAS dans du code HTML ou qui ne sont PAS des liens.

J'ai trouvé sur internet une regex qui cherche tout ce qui n'est pas du html, mais ce n'est pas suffisant, il faudrait que cela détecte aussi les liens (la partie entre le <a> et le </a>) : (?<=^|>)[^><]+?(?=<|$)

Merci d'avance.