[Résolu] Soucis preg_replace et gestion d'url

Eléphanteau du PHP | 10 Messages

26 oct. 2011, 19:43

Bonjour à tous :)

Après avoir passé ma journée à chercher une solution par moi même et sur le web, je viens m'inscrire sur le forum afin de vous exposer mon problème.

Je souhaite rendre cliquable et modifier une url dans un texte soumis par formulaire.
J'arrive donc à garder le texte non url et à rendre cliquable les phrases type http:// etc etc.
Mais impossible de modifier l'url comme je le souhaite.

Code : Tout sélectionner

$pattern= "/(((http[s]?:\/\/)|(www\.))(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+|\.[a-z]+(\.[a-z]{2,2})?)\/?[,a-z0-9._\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is"; $monmessage = preg_replace($pattern, " <a href=\"".$http."$1\"".$replace." target=\"_blank\">$1</a>", $monmessage); return $monmessage;
Je souhaiterai réduire mon url avec un code type bit.ly mais impossible de ne récupérer que le ou les liens de mon texte. Y'a t'il un moyen de faire quelque chose dans ce gout la ?

Code : Tout sélectionner

$monmessage = preg_replace($pattern, 'file_get_contents('http://convertisseururl.com/?monurl=$1');', $monmessage);
ou $1 serait mon url à remplacer...

Je débute en code et j'imagine que le $1 n'est pas une variable dans ce cas, mais plutôt quelque chose comme un array. J'imagine aussi qu'on ne peut pas executer une fonction à l'intérieur du preg_replace... (_callback ?)

Je suis perdu ! thank you guyz pour votre aide :)
Modifié en dernier par Snek le 01 nov. 2011, 17:42, modifié 2 fois.

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

27 oct. 2011, 16:30

salut,
Je débute en code et j'imagine que le $1 n'est pas une variable dans ce cas, mais plutôt quelque chose comme un array. J'imagine aussi qu'on ne peut pas executer une fonction à l'intérieur du preg_replace... (_callback ?)
le $1 c'est une référence sur ton motif (1ère correspondance capturante).

après je ne vois pas bien le coup du file_get_contents, tu veux récupérer le contenu d'un fichier en fonction du $1 et le mettre dans la chaine de caractère ?

si oui dans ce cas effectivement va falloir utiliser preg_replace_callback pour le faire (avec une fonction, donc dites de rappel, dans lequel tu pourra utiliser file_get_contents sans problème).
regarde dans la doc il y a même un exemple avec les fonctions anonymes.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

27 oct. 2011, 17:39

Bonjour :)

Tout d'abord merci pour cette réponse ! J'étais effectivement sur la bonne voie, mais il me reste un détail que je n'arrive pas à saisir.
En effet je dois récupérer le contenu d'une page qui retourne une url rétrécie en fonction de l'url que j'envoi. Le soucis c'est que lorsque je créé une fonction en amont, que dois-je utiliser pour lui indiquer l'url capturée ? $1 ?

le principe est le suivant:

l'url postée est du type: http://www.monsite.com/monarticle/id-article.html
je dois récupérer le contenu de la page: http://convertisseururl.com/?id=http:// ... ticle.html

et le résultat est quelque chose comme: http://url.ly/abcd

Quelque chose comme ca ? mais visiblement cela ne fonctionne pas. C'est la 1ère fois que je rencontre ce cas de figure :/

Code : Tout sélectionner

$pattern= "/(((http[s]?:\/\/)|(www\.))(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+|\.[a-z]+(\.[a-z]{2,2})?)\/?[,a-z0-9._\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is"; function replaceurl () { file_get_contents('http://convertisseururl.com/?id=$1');} $monmessage = preg_replace_callback($pattern, "replaceurl", $monmessage); return $monmessage;
Je pense que mon approche n'est pas la bonne mais je ne vois pas trop.

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

27 oct. 2011, 17:50

je dirais plutot
function replaceurl ($match) { file_get_contents('http://convertisseururl.com/?id='.$match[ $index qui correspond à l'url dans le motif ]);}

A tu compris les exemples de la doc de preg_replace_callback ?

tu doit avoir une variable en paramètre de la fonction de rappel.
cette variable contient un tableau correspondant au masque, le zéro c'est la chaine, le 1 la 1ère parenthèse capturante etc etc

a priori, j'ai pas regardé le motif :D, l'index sera 1 dans la fonction que j'ai modifié ci dessus :)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

27 oct. 2011, 17:52

Re bonjour,

On va tester avec ca mais en voyant le code que tu met, effectivement je cerne un peu mieux l'utilisation. Je croise les doigts !!

Merci

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

27 oct. 2011, 17:55

:mrgreen: :mrgreen: :mrgreen: :mrgreen:
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

28 oct. 2011, 11:14

J'ai beau essayé en respectant la syntax et les exemples données par le manuel, page blanche. Visiblement y'a qq chose que je n'arrive pas à saisir. C'est à s'arracher les cheveux ! #-o

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

28 oct. 2011, 11:24

poste le code stp sinon faut jouer aux devinettes ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 10 Messages

28 oct. 2011, 12:08

Voici mon code complet:

Code : Tout sélectionner

static public function replaceURL( $monmessage , $noFollow = false , $newWindow = false ) { if ($monmessage == '') { return ''; } $http=""; if(strpos($monmessage,'www')!==false && strpos($monmessage,'http://')===false){ $http="http://"; } $pattern = "/(((http[s]?:\/\/)|(www\.))(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+|\.[a-z]+(\.[a-z]{2,2})?)\/?[,a-z0-9._\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is"; function replaceurl ($matches) { $newurl = file_get_contents('http://api.bit.ly/v3/shorten?login=monlogin&apiKey=mykey='.$matches[1].'&format=txt'); /* le résultat de cette appel doit me retourner par ex http://bit.ly/abcdef qui devient ma nouvelle url à remplacer dans le message */ return '<a href="'.$http.$newurl.'>'.$newurl.'</a>';} $message = preg_replace_callback($pattern, "replaceurl", $monmessage); return $monmessage; }
Je m'attaque surement à un code trop complexe pour mon niveau, mais étant donné que je suis le seul au boulot a pouvoir mettre la main la dedans, un peu d'aide me serait très utile !
Merci encore Moogli :D

Eléphanteau du PHP | 10 Messages

28 oct. 2011, 12:15

g juste ouvlié de supprimer "$noFollow = false , $newWindow = false" dans mon copier coller car je ne fais plus appel à ca.

ViPHP
ViPHP | 2577 Messages

28 oct. 2011, 12:24

Bonjour,

Tu devrais remplacer le contenu de ta fonction par un var_dump($matches). Ca te permettrai de voir ce dont tu disposes exactement pour faire le calcul de la nouvelle chaine et de valider ton pattern.

Eléphanteau du PHP | 10 Messages

28 oct. 2011, 14:26

Bon y'a du mieux puisque même si ma page reste blanche, j'ai ceci qui s'affiche avec une partie du message:

string(56) "http://www.urldemonsite.com/mon-super-article/" [2]=> string(7) "http://" [3]=> string(7) "http://" [4]=> string(0) "" [5]=> string(17) "www.urldemonsite" [6]=> string(4) "www." }

je suppose donc qu'il faut que j'utilise matches[2] afin de remplacer mon url dans mon file_get_contents... mais pageblanche si je vire le var_dump. y'a qu'en remettant preg_replace au lieu de preg_replace_callback et en enlevant ma function replaceur que la page s'affiche correctement.

ViPHP
ViPHP | 2577 Messages

28 oct. 2011, 16:12

Il faudrait voir ce que fait :
            $newurl = file_get_contents('http://api.bit.ly/v3/shorten?login=monlogin&apiKey=mykey='.$matches[1].'&format=txt'); /* le résultat de cette appel doit me retourner par ex http://bit.ly/abcdef qui devient ma nouvelle url à remplacer dans le message */
Je soupçonne que $newurl soit vide.
Normalement, ta page est vide, mais en regardant le source HTML, tu dois trouver : <a href="></a> qui ne se voit pas dans le navigateur. A priori, il manque aussi une " lors de la mise en forme de href="....". Cela peut également explique la page blanche.

Edit : return '<a href="'.$http.$newurl.'">'.$newurl.'</a>';

Eléphanteau du PHP | 10 Messages

28 oct. 2011, 19:17

Alors tout d'abord avant de vous en dire plus, je tiens à vous remercier les gars @Moogli @Mazarini !! C'est vraiment super d'avoir pris le temps de m'aider.

Je viens de tester le code en local et visiblement il marche impeccablement. Mais dès que je l'implémente au reste de mon fichier helper, badaboom ca coince.

Eléphanteau du PHP | 10 Messages

28 oct. 2011, 19:53

register_globals est sur off dans la config php... ca peut jouer ?