2011-06-28 3 views
0

J'ai travaillé cette regex et sa fin, mais seulement un problème de plus travailler dans ce, il correspond à un mot avec plus d'une périodePHP Regex pour url

Par exemple (.): Stuf ... (je me suis adapté Comment puis-je limiter la période à "Autoriser seulement 1 période par jeu de parenthèses" dans l'expression rationnelle?

'#((\w+://)?(\w+\.)([a-z0-9\-/.?=_&%])+)#i' 
+1

\. {1} fonctionne normalement, mais je ne sais pas php :-) –

+1

C'est un preg_match pour remplacer les liens dans le texte. Alors peut-être que le filtre ne pouvait pas aider? J'ai essayé {1} mais si je le mets, j'obtiendrai l'erreur: '# ((\ w +: //)? (\ W + \.) ([A-z0-9 \ - /. { 1}? = _ &%]) +) # I ' – pakito

+0

Pakito, à quelle RFC faites-vous référence lorsque vous posez la question sur les URL? Serait bon de connaître le protocole aussi bien. Est-ce spécifiquement pour les protocoles http et https? – hakre

Répondre

0

Essayez ceci:

'#((\w+://)?(\w+)(\.[a-z0-9\-/?=_&%]+)+)#i' 

Cela nécessite une période non-char après chaque période.

Mais je recommande quelque chose comme ceci:

'#((\w+://)?\w+(\.[a-z0-9\-]+)*\.[a-z\-]{2,}(/[\w\-./?=&%]*)?)#i' 
+0

Malheureusement, cette acceptation URIs comme 'http: //.- sample.-com' qui ne sont pas valides (un tiret ne peut pas être le premier caractère). –

+0

@Igor: oui, mais un RegEx correct pour les URI juridiques serait trop long ... – Floern

+0

lol j'ai testé sur facebook avec http: //.-sample.-com et il a accepté comme une URL valide aussi bien. – pakito

0

Cela devrait fonctionner:

[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4} 

La question dans l'expression rationnelle que vous utilisez est que vous utilisez la version gourmande « + » dans la classe de caractères qui comprend votre période. La regex que j'ai posté ici ne vérifie qu'une seule période dans le nom.

Ce modèle correspondra avec succès à google.com, www.google.com et à un nombre arbitraire de sous-domaines.

NOTE: ICANN a récemment annoncé que bientôt ils permettront tout domaine de premier niveau (par exemple, au lieu de seulement .com, .org, etc., ils permettront bientôt .whatever), vous devrez peut-être ajuster la dernière partie de la regex, "{2,4}", puisque les TLD seront bientôt de longueur arbitraire.

+0

Déjà manquant sur '.museum'. –

+0

Oui merci normalo, c'est (tld) quelque chose que j'essaie d'éviter aussi. – pakito

+0

Ah, je ne savais pas .museum était déjà utilisé. Eh bien, cela rend un peu plus difficile, parce que maintenant vous êtes essentiellement à la recherche de toute.bination.des.personnalités.valides.délimitées.par.des.périodes.avec.des.espaces.et.n'y.pas.en.une.ponctuation. mark: S Le défi vient de l'augmentation des possibles faux positifs. Je suppose que vous devrez juste essayer et voir ce qui se passe. – jefflunt

0

Eh bien, si vous voulez valider les URL, pourquoi ne pas utiliser parse_url()? Je pense qu'il est difficile de créer une regex générale pour tant de formes d'URL variées