comprendre une fonction regexp

Invité
Invité n'ayant pas de compte PHPfrance

25 mars 2009, 14:05

Bonjour à tous,

Je souhaite modifier une fonction trouvée dans un logiciel open source:
	function convertInternalLink($body)
	{
		global $mainframe;

		$patterns = array();
		$replacements = array();
		$i = 0;
		$href_exp = "/href=\"(.*?)\"/";
		$link_exp =  "[^http:\/\/www\.|^www\.|^http:\/\/]";

		preg_match_all($href_exp, $body, $out, PREG_SET_ORDER);

		foreach ($out as $val)
		{
			$links = preg_match($link_exp, $val[1], $match, PREG_OFFSET_CAPTURE);

			if(!$links)
			{
				$patterns[$i] = 'href="'. $val[1] . '"';
				$replacements[$i] = 'href="'. JURI::root().$val[1] . '"';
				$body=str_replace($patterns[$i],$replacements[$i],$body);
				$i++;
			}
		}
		return $body;
	}
}
C'est une fonction qui traite du texte ($body) saisi à partir d'un éditeur wysiwig, dans le but de modifier les liens hypertextes.

Mon problème: lorsque je crée mon texte ($body), les liens sont comme ceci:
http://www.mondomaine.com/index.php?option=com_virtuemart&page=shop.browse&category_id=54&Itemid=2&lang=fr
Après passage dans la fonction, le même lien ressort comme ceci:
http://index.php/?option=com_virtuemart&page=shop.browse&category_id=54&Itemid=2&lang=fr
2 changements:
1- www.mondomaine.com/ a été supprimé de l'url
2- index.php? est devenu index.php/?

Je suppose que c'est la fonction ci dessus qui n'est pas au point, mais pas de support pour le logiciel.
Je viens donc poster ici, cherchant de l'aide pour comprendre la fonction et modifier ce qui ne fonctionne pas bien.

Merci à tous pour quelques conseil éclairés.

Petit nouveau ! | 5 Messages

03 avr. 2009, 11:50

Tu ne dois pas utiliser une expression regulare pour l'extraction des liens hypertextes.
Mais tu peux utiliser une parser html: PHP Simple HTML DOM Parser

Inno

Invité
Invité n'ayant pas de compte PHPfrance

18 avr. 2009, 17:40

pourquoi ne faut il pas utiliser une rexpression regulier pour les liens?

Invité
Invité n'ayant pas de compte PHPfrance

21 avr. 2009, 15:57

personne ne confirme ou ne contredit ce qu'a dit innocentum?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 avr. 2009, 16:36

Effectivement, je me demande pourquoi il ne faut pas utiliser d'ER :-k

Je ne donne pas de jugement sur la solution de Innocentus, mais les expressions régulières peuvent convenir tout de même ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 avr. 2009, 14:15

Bah en ce qui me concerne, je vais en porter un de jugement, vu que par curiosité j'ai téléchargé l'bidule en question pour voir comment il fonctionnait. Résultat, pas moins de 8 appels à preg_match() ou preg_match_all() et patterns associés... :-*

Je vois pas bien l'intérêt de recommander une solution qui repose sur des expressions régulières pour éviter l'usage d'une ER ... A part coller 1000 lignes de code supplémentaire à interpréter dans les dents de php, va vraiment falloir chercher pour trouver un argument convaincant :-s
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...