expression regulière

Nouveau WRInaute
Bonjour,

j'utilise une expression du style :

Code:
$machaine = ereg_replace("(http://[a-zA-Z0-9\.\?=&/,;:%#~_+-]*)","<A href='\\1' target=_blank>\\1/A>",$machaine);

la partie entre les balises : \\1, je ne voudrais en récupérer qu'un certain nombre de caratère et la je bloque (si \\1 fait plus de 100 caractère par exemple, je n'affiche pas plus...).
je cherche sur le net... pas trop d'info...
si quelqun peu m'aiguiller...
 
Nouveau WRInaute
oui j'ai vu quelques truc comme ça sur le net, le soucis c'est que si je fais ça, le lien n'est plus bon !!! la valeur dans le href ne doit pas être coupé, seulement la valeur \\1 à l'intérieur des balises <a>, c'est ce qui rend compliqué ma tache...

merci pour ta réponse
 
WRInaute passionné
Tu devrais cherché plutôt du côté de preg_replace_callback

ça te permettra de récupéré les différentes partie de ton masque et de reconstruire ce que tu veux en ne gardant que x caractères par exemple.

C'est très utile pour des regex complexes
 
Nouveau WRInaute
parfait, ça fonctionne comme ça :)))
seul soucis, ça m'affiche <a href='monlien'>ma chaine coupé</a> et pas en lien cliquable :-((,
 
WRInaute impliqué
et ça ?
$machaine = ereg_replace("(http://[a-zA-Z0-9\.\?=&/,;:%#~_+-]{1,100})([a-zA-Z0-9\.\?=&/,;:%#~_+-]*)","<A href='\\1\\2' target=_blank>\\1/A>",$machaine);
 
WRInaute passionné
de_prog a dit:
parfait, ça fonctionne comme ça :)))
seul soucis, ça m'affiche <a href='monlien'>ma chaine coupé</a> et pas en lien cliquable :-((,

Revoit tes valeurs parsées ; tu as forcément un problème à ce niveau là.
 
Nouveau WRInaute
merci pour vos réponses


Tilt a dit:
et ça ?
$machaine = ereg_replace("(http://[a-zA-Z0-9\.\?=&/,;:%#~_+-]{1,100})([a-zA-Z0-9\.\?=&/,;:%#~_+-]*)","<A href='\\1\\2' target=_blank>\\1/A>",$machaine);


bah justement ça m'affiche
<a href ='machaine'>machaine</a> et pas en lien cliquable.

sinon medium je ne voit pas vraiment...
je fais un $machaine = contenu d'un texte récup d'un formulaire.
ereg de cette chaine pour repérer lien cliquable et echo $machaine.
 
Nouveau WRInaute
un htmlspecialchars, effectivement c'est pour ça... seulement ça craint de pas utiliser ça !!!
du coup je cherche une autre solution mais quelquechose m'echape !!
si j'utilise pas htmlspecialchars ou htmlentities, ça m'affiche pas de lien mais http... sans les a href ???!!!!!

je refais mon truc parceque j'ai du rater quelquechose...
 
Nouveau WRInaute
Merci pour toutes vos réponses, je touche au but !!!

Pour ceux qua ça pourrait interresser :
le but était de rendre cliquable des url posté dans des messages.
j'ai donc utiliser une expression régulière comme celle indiqué par Tilt

Code:
$machaine = ereg_replace("(http://[a-zA-Z0-9\.\?=&/,;:%#~_+-]{1,100})([a-zA-Z0-9\.\?=&/,;:%#~_+-]*)","<A href='\\1\\2' target=_blank>\\1/<A>",$machaine);
sauf qu'à la place de <A href et <a> j'ai mis [URL et [/URL]

cela permet après en utilisant des fontion du type htmlentities et htmlspecialchar de pouvoir remplacer les [ULR et [/URL] par les vrais balises <A> par un simple str_replace.


je souhaite maintenant supprimer certain caractères de mon lien :
exemple :
<A HREF=''lien">lien</A>
donc :
1/ Identifier la chaine de caractère contenu dans le HREF
2/ supprimer les "<br />" si on en trouve seulement dans cette chaine de caractères et pas dans tout mon texte.

je pense que les expressions régulières sont les mieux placé pour gérer ça mais c'est pas si évident...
si quelqun a une idée...
 
Nouveau WRInaute
Voila j'ai fait ça, ma première expression regulière que je fait seul :

$machaine = eregi_replace("('http)(.+)(<br />*)(.+)('>)","\\1\\2\\4\\5",$machaine);

ça marche dans certain cas et pas dans d'autres...?!
je débute en expression régulière :-(...

si quelqun peut m'aider...
 
WRInaute accro
de_prog a dit:
sauf qu'à la place de <A href et <a> j'ai mis [URL et [/URL]

cela permet après en utilisant des fontion du type htmlentities et htmlspecialchar de pouvoir remplacer les [ULR et [/URL] par les vrais balises <A> par un simple str_replace.
si quelqun a une idée...

moi j'utilise ça :
Code:
	function BBencode($in){
		$in = eregi_replace("<","&lt;",$in);
		$in = eregi_replace(">","&gt;",$in);
		$in = eregi_replace("\n","          <br/>",$in);
		$in = eregi_replace("\[b\]","<b>",$in);
		$in = eregi_replace("\[/b\]","</b>",$in);
		$in = eregi_replace("\[i\]","<i>",$in);
		$in = eregi_replace("\[/i\]","</i>",$in);
		$in = eregi_replace("\[u\]","<u>",$in);
		$in = eregi_replace("\[/u\]","</u>",$in);
		$in = eregi_replace("\[center\]","<center>",$in);
		$in = eregi_replace("\[/center\]","</center>",$in);
		$in = eregi_replace("\[titre\]","<h2>",$in);
		$in = eregi_replace("\[/titre\]","</h2>",$in);
		$in = eregi_replace("\[stitre\]","<h3>",$in);
		$in = eregi_replace("\[/stitre\]","</h3>",$in);
		$in = eregi_replace("\[quote\]","<div class="quote">",$in);
		$in = eregi_replace("\[/quote\]","</div>",$in);
		$in = eregi_replace("\[img\]","<img class="img_forum" src="",$in);
		$in = eregi_replace("\[/img\]","" alt="">",$in);
		$in = eregi_replace("\[imgleft\]","<img class="img_forum_left" src="",$in);
		$in = eregi_replace("\[imgright\]","<img class="img_forum_right" src="",$in);
		$in = eregi_replace("\[url=","<a target="_blank" rel="nofollow" href="",$in);
		$in = eregi_replace("\[purl=","<a target="_blank" href="",$in);
		$in = eregi_replace("\[/url\]","</a>",$in);
		$in = eregi_replace("\[col=","<font color="",$in);
		$in = eregi_replace("\[/col\]","</font>",$in);
		$in = eregi_replace("\]","">",$in);
	}

et j'appel comme cela :

$messageHTML = BBencode(stripslashes($messageBBCode));
 
Nouveau WRInaute
super zeb, c'est un truc comme ça que je suis en train de construire, ça marche vraiement bien .... j'ai mis du temps à y penser... je suis sur la bonn piste :)

Tilt, en fait je peux pas utiliser strip_tag parcequ'il le fait sur tout mon texte alors que moi je ne veux intervenir que sur certaine partie de mon texte
mon texte ressemble à peu près à ça :

$machaine = la tortue se baigne <a href='dans<br/> le lac'>dans<br /> le lac</a> elle a froid <a href='au <br/>pied'>au <br />pied</a>, la pauvre.

il faut que je vire les <br /> qui se trouve dans l'url sinon forçément elle marche pas, d'ou l'expression regulière , je veux lui dire, repère le texte compris entre "href=" et "'>" et fais sauter les <br />.

j'ai donc fait ça :
$machaine = eregi_replace("(href=)(.+)(<br />*)(.+)('>)","\\1\\2\\4\\5",$machaine);

ça marche seulement sur les chaine ou il n'y a qu'un seul <br />...
 
WRInaute passionné
Je t'ai donné une piste, mais je vois que tu as un peu de mal...

J'ai beaucoup galéré avec les expressions régulières, alors je sais ce que sait !!

D'autant que mon site les utilise à outrance ; c'est un véritable trésor pour gagner du temps. Une grande partie de mes pages ne contiennent que très peu de pseudo BBcode grâce à cela et à d'autres artifices :wink:

Voilà une solution à ton problème sour la forme d'un test :

Code:
function codageUrl($value) {
	
	$value = preg_replace('#<br ?/>#U', '', $value[1]); // Supprime les saut de ligne ; le « ? » indique que l'espace précédant est facultatif
	
	$url = '<a href=\''.$value.'</a>';
	
	return $url;
	
}

$value = '<a href=\'dans<br/> le lac\'>dans<br /> le lac</a> elle a froid <a href=\'au <br/>pied\'>au <br />pied</a>';

echo '<p>Avant : '.$value.'</p>';

$value = preg_replace_callback('#<a href=(.+)</a>#U', 'codageUrl', $value); // On récupère la partie à traiter dans une fonction

echo 'Après : '.$value;
 
Discussions similaires
Haut