2010-06-06 3 views
1

En PHP, je dois être capable de déterminer si une chaîne contient une URL. S'il y a une URL, j'ai besoin de l'isoler comme une autre chaîne séparée.PHP si la chaîne contient une URL isoler

Par exemple: « SESAC SHOWIN l'amour http://twitpic.com/1uk7fi! »

Je dois être en mesure d'isoler l'URL dans cette chaîne dans une nouvelle chaîne. En même temps, l'URL doit être conservée dans la chaîne d'origine. Suivre? Je sais que c'est probablement très simple mais ça me tue.

+0

Cela fonctionne, merci artefacto. Merci à tous les autres pour la contribution. –

+0

Pouvez-vous éventuellement partager le code? J'ai cherché partout pour cela. – Sobiaholic

Répondre

8

Quelque chose comme

preg_match('/[a-zA-Z]+:\/\/[0-9a-zA-Z;.\/?:@=_#&%~,+$]+/', $string, $matches); 

$matches[0] contiendra le résultat.

(Note: cette regex n'est certainement pas conforme à la norme RFC, elle peut aller chercher des URL malformées (selon la spécification) Voir http://www.faqs.org/rfcs/rfc1738.html).

+0

+1 Bien. Souhaitez-vous ajouter une version qui n'écoute 'http' que pour les générations futures? –

+0

Le schéma est '[a-z]'. Il ne peut y avoir ni majuscules ni chiffres dans la partie schéma d'une URL. Et franchement, il n'y a pas trop de schémas valides pour commencer. – Tomalak

+1

@Tomalak Oui, mais parfois les gens écrivent HTTP: //, c'était censé capturer ça. Je vais enlever les chiffres. – Artefacto

-1
$test = "SESAC showin the Love! http://twitpic.com/1uk7fi"; 
$myURL= strstr ($test, "http"); 
echo $myURL; // prints http://twitpic.com/1uk7fi 
+0

Pas bon: ne pas analyser les URL sans http, et attraper' http' même s'il est utilisé en dehors d'un contexte d'URL. –

+0

seulement travailler avec le protocole http sorcière n'est pas bon – ddjikic

0

URL ne peuvent pas contenir d'espaces, donc ...

 
\b(?:https?|ftp)://\S+ 

doit correspondre à quelque chose comme URL dans une chaîne.

Ce qui précède est l'expression rationnelle pure. PHP preg_ * et les règles d'échappement de chaîne s'appliquent avant de pouvoir l'utiliser.

2

Ceci ne tient pas compte des tirets -. besoin d'ajouter -

preg_match('/[a-zA-Z]+:\/\/[0-9a-zA-Z;.\/\-?:@=_#&%~,+$]+/', $_POST['string'], $matches); 
Questions connexes