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 17/09/2006, 15h13   #1
Invité régulier
 
Inscription : août 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 15
Points : 5
Points : 5
Par défaut Pb Regex extraction URL

Bonjour,
Je souhaiterai extraire les urls des balises :
provenant d'une sortie html d'un script php.
Les urls que je souhaite identifier sont écrites sans quotes :
Ex : href=toto.php?x=1&y=2

J'ai fouillé le forum sans succès donc j'ai avancé un peu par moi-même pour obtenir le résultat suivant :
Citation:
{href=(.*?)( |>)}s
Le second sous-masque ( |>) sert à identifier le caractère qui vient après le dernier caractère de l'url, donc ' ' ou '>'.
Ce regex marche presque sauf qu'il me retourne deux sous-chaînes :
- l'url
- les caractères ' ' ou '>' suivant les cas
Or je souhaiterai qu'il me retourne que l'url !
Merci de votre aide.

PS : Pour tester :
http://www.quanetic.com/regex.php

-Fly06
fly06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2006, 16h06   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
montre nous un petit exemple de code PHP que tu utilises
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2006, 18h06   #3
Invité régulier
 
Inscription : août 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 15
Points : 5
Points : 5
Merci pour ta réponse, mathieu.

En fait mon objectif est de faire de la réécriture d'url en utilisant la fonction preg_replace_callback.

En cherchant, je me suis aperçu que la syntaxe suivante :
Citation:
{href=(.*?)(?: |>)}s
donnait le résultat attendu (parenthèses non capturantes).

Mais à l'usage, la fonction preg_replace_callback remplaçait l'url d'origine par l'url transformée non pas à la place de l'url définie par matches[1] mais à la place du pattern global (' ' ou '>' inclus) !!!

En lisant la doc sur preg_replace_callback, je crois comprendre que les composantes du tableaux $matches (d'indices 1, 2, ...) correspondent aux sous-masques du regex... (Vous confirmez ?)

Donc si je garde mon regex d'origine, il suffit de modifier la fonction de remplacement appelée dans preg_replace_callback pour qu'elle ajoute $matches[2] à la fin de l'url transformée... et le tour est joué !

Je viens d'avoir l'idée, je n'ai pas encore testé... (merci de me donner votre avis).

-Fly06
fly06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2006, 21h58   #4
Invité régulier
 
Inscription : août 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 15
Points : 5
Points : 5
Bon j'ai testé et ça a l'air de marcher

Vous vouliez du code ? En voilà :

J'utilise un CMS qui gère le SEF mais j'ai un module tiers qui lui ne le gère pas.
Ce module tiers retourne du code html dans une variable $content qui peut contenir une ou plusieurs urls. Ces urls ne sont pas conforme W3C puisque les quotes manquent mais bon les browsers comprennent...
J'ai donc ajouté le code qui sert à transformer les urls pour le contenu html du CMS à la fin du module (juste avant le return) :

Citation:
$regex = "#href=\"(.*?)\"#s";
$content = preg_replace_callback( $regex, 'sef_replacer', $content );
La fonction sef_replacer fait le boulo de transformation url standards ==> urls modifiées SEF.

Le pb était que ce regex suppose que les urls sont entourées de double quotes ! Il fallait donc le changer.

J'ai donc opté pour le regex du premier post :
Citation:
$regex = "#href=(.*?)( |>)#s";
Mais comme la fonction preg_replace_callback retourne un tableau $matches dont les composantes (d'indices 1, 2, ...) correspondent aux sous-masques du regex et que le remplacement se fait sur la totalité du regex et non sur le premier sous-masque il fallait aussi changer la fonction sef_replacer en sef_replacer_2 :
Citation:
$content = preg_replace_callback( $regex, 'sef_replacer_2', $content );
avec :

Citation:
function Sef_replacer_2( &$matches ) {
return Sef_replacer( &$matches ) . $matches[2];
}
Voilà vous savez tout.

Je pense que c'est ok en dehors du simple fait que ça a l'air de marcher mais bon j'ai découvert les expressions régulières ce matin donc j'aimerai bien avoir le feedback d'une personne qui a un peu plus de recul sur la question...

-Fly06
fly06 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 08h26.


 
 
 
 
Partenaires

Hébergement Web