2010-10-14 4 views
1

J'essaie d'identifier les URL dans un ensemble de texte. Cependant, je voudrais être en mesure d'identifier les urls formés loosly tels que:Correspondant à des URL lâches avec regex et php?

example.com
www.example.com

Je ne suis pas très bon à regex :(

J'ai trouvé bagout ci-dessous, mais malheureusement, il exige que le système.

/(([[:alnum:]]+:\/\/)|www\.)([^[:space:]]*)([[:alnum:]#?\/&=])/i 

serait-il possible de faire correspondre une chaîne complète (sans espace) qui comprend .com ou .net ou .org, etc?

Merci

Répondre

0

Pour correspondre uniquement une chaîne de caractères, qui ne contiennent pas d'espace et de fin dans ".com", ".net" ou ".org":

/[^\s]+\.(?:com|net|org)\b/i 

Explication:

  • / = Début d'une expression régulière
  • [^\s] = Non (^) une espace (\s) caractère
  • + = Un ou plusieurs de l'ensemble précédent (caractères non-blancs)
  • \. = un point. Les points en regExps sont des caractères spéciaux sinon
  • (?: ...) = Un groupe, mais pas un à stocker
  • com|net|org = com OU net OU org (Vous pouvez ajouter ici, séparés par "|")
  • \b = A limite de mot - la fin d'un mot
  • / = fin de l'expression régulière (en dehors des indicateurs facultatifs)
  • i = Insensible à l'arrêt

Extension de réponse

À la demande de l'OP, le ci-dessous est un (rugueux) RegExp qui devrait correspondre à une URL d'un domaine se terminant dans les chaînes spécifiées, et avec une ou plusieurs paires clé = valeur dans la chaîne de requête.

/[^\s]+\.(?:com|net|org)[^\s]+\?[^\s]+=[^\s]+(?:\&?[^\s]+=[^\s]+)*\b/i 
  • / = Début d'une expression régulière
  • [^\s]+\.(?:com|net|org) = Comme précédemment
  • [^\?]+ = un ou plusieurs caractères non-questionmark (ce serait un dossier ou noms de fichiers). Encore une fois, la Questionmark a une \ avant qu'elle ne l'avoir traité comme un caractère normal, que, sinon, il a une signification particulière ici
  • \? = A Questionmark
  • [^\s]+\=[^\s]+ = Un ou plusieurs non-espaces blancs, puis un signe égal signe, puis un ou plusieurs non-espacements
  • (?:\&?[^\s]+=[^\s]+)* = None ou plusieurs ensembles d'une esperluette &, puis encore un ou plusieurs non-espaces blancs, un signe égal, et un ou plusieurs non-espacements
  • \b = Fin de la chaîne
  • / = Fin de l'expression régulière
  • i = Insensible à l'autre

REMARQUE: Cela ne regarde pas les URL complètement valides et ne permet à la multitude de codes de pays (comme » .com. au 'pour l'Australie), ou d'autres domaines de premier niveau (comme' .edu ', etc.) Mais, il correspondra à l'exemple de chaîne fourni, de twitter.com/example?var=true

+0

C'est génial, merci pour l'aide, pourriez-vous expliquer comment aussi correspondre avec des liens qui ont des chemins, comme twitter.com/example?var=true? – briangallagher

0

Le risque de faux positifs est là, mais minime. Donc, vous pouvez en effet utiliser quelque chose comme:

/\b(([-\w]{2,}\.)+(com|net|org|info)|www(\.\w{3,})+\.\w{2,6})\b/i 

La première moitié est pour les domaines .com ordinaires/.net, le second correspond tout à www. préfixe. C'est plus difficile si vous vouliez détecter ces noms de domaine en plus à http: // urls complet.

+0

Merci pour le poste , mais ne fonctionne pas exactement. L'exemple de texte que je lui ai donné était "www.twitter.com twitter.com http://www.google.com http://www.google.ie" donc en théorie, il aurait dû correspondre à tous sauf http: // www. google.ie. Cependant, il correspond à tous les 4 et dépouiller le http: // que je voudrais laisser intact. – briangallagher