Modèle d'expression régulière pour correspondre à l'url avec ou sans http://www

Je ne suis pas très bon en expressions régulières du tout.

J'ai utilisé beaucoup de CODE framework à ce jour, mais je suis incapable d'en trouver un capable de correspondre à une URL comme http://www.example.com/etcetc mais aussi capable d'attraper quelque chose comme www.example.com/etcetc et example.com/etcetc.

Toute aide serait géniale. Merci les gars!

27
demandé sur Michael Myers 2011-06-21 19:06:53

8 réponses

Pour faire correspondre tous les types D'URL, le code suivant devrait fonctionner:

<?php
    $regex = "((https?|ftp)://)?"; // SCHEME
    $regex .= "([a-z0-9+!*(),;?&=$_.-]+(:[a-z0-9+!*(),;?&=$_.-]+)?@)?"; // User and Pass
    $regex .= "([a-z0-9\-\.]*)\.(([a-z]{2,4})|([0-9]{1,3}\.([0-9]{1,3})\.([0-9]{1,3})))"; // Host or IP
    $regex .= "(:[0-9]{2,5})?"; // Port
    $regex .= "(/([a-z0-9+$_%-]\.?)+)*/?"; // Path
    $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+/$_.-]*)?"; // GET Query
    $regex .= "(#[a-z_.-][a-z0-9+$%_.-]*)?"; // Anchor
?>

Ensuite, la façon correcte de vérifier par rapport à l'expression rationnelle est la suivante:

<?php
   if(preg_match("~^$regex$~i", 'www.example.com/etcetc', $m))
      var_dump($m);

   if(preg_match("~^$regex$~i", 'http://www.example.com/etcetc', $m))
      var_dump($m);
?>

Courtesy: Observations formulées par splattermania sur le manuel PHP: http://php.net/manual/en/function.preg-match.php

Démo RegEx dans regex101

44
répondu anubhava 2017-10-22 12:42:07

Cela fonctionne pour moi dans tous les cas que j'avais testés:

$url_pattern = '/((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.([a-zA-Z0-9\&\.\/\?\:@\-_=#])*/';

Essais:

http://test.test-75.1474.stackoverflow.com/
https://www.stackoverflow.com
https://www.stackoverflow.com/
http://wwww.stackoverflow.com/
http://wwww.stackoverflow.com


http://test.test-75.1474.stackoverflow.com/
http://www.stackoverflow.com
http://www.stackoverflow.com/
stackoverflow.com/
stackoverflow.com

http://www.example.com/etcetc
www.example.com/etcetc
example.com/etcetc
user:pass@example.com/etcetc

example.com/etcetc?query=aasd
example.com/etcetc?query=aasd&dest=asds

http://stackoverflow.com/questions/6427530/regular-expression-pattern-to-match-url-with-or-without-http-www
http://stackoverflow.com/questions/6427530/regular-expression-pattern-to-match-url-with-or-without-http-www/

Chaque URL Internet valide a au moins un point, donc le modèle ci-dessus va simplement essayer de trouver au moins deux chaînes enchaînées par un point, et a des caractères valides que L'URL peut avoir.

15
répondu H Aßdøµ 2016-02-25 10:46:35

Essayez ceci:

/^http:\/\/|(www\.)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/

Il fonctionne exactement comme les gens veulent.

, Il prend avec ou sans http://, https://, et www.

4
répondu Jignesh Patel - Sr. HTML Dev. 2014-10-17 12:48:30

Vous pouvez utiliser un point d'interrogation après une expression régulière pour le rendre conditionnel si vous voulez utiliser:

http:\/\/(www\.)?

Qui correspond à tout ce qui a soit http://www. ou http:// (sans www.)

Ce que vous pouvez faire est simplement d'utiliser une méthode replace pour supprimer ce qui précède, vous obtenant ainsi le domaine. Cela dépend de ce que vous avez besoin du domaine.

2
répondu Michael Wright 2011-06-21 15:13:01

Je sais que c'est un ancien post, mais je contribue simplement à ma solution qui est une combinaison de certaines des réponses que j'ai trouvées ici sur stackoverflow.

/(https?://)?((?:(\w+-)*\w+)\.)+(?:[a-z]{2})(\/?\w?-?=?_?\??&?)+[\.]?([a-z0-9\?=&_\-%#])?/g

Correspond something.com, http(s):// ou www. Ne correspond pas à d'autres url [something]://, mais pour mon but, ce n'est pas nécessaire.

La regex correspond par exemple:

http://foo.co.uk/
www.regex.com/foo.html?q=bar$some=thi-ng,regex
regex.foo.com/blog
2
répondu Nyveria 2015-09-23 11:18:36

Essayez quelque chose comme ceci:

.*([\w-]+\.)+[a-z]{2,5}(/[\w-]+)*
1
répondu morja 2011-06-21 15:12:17

Essayez ceci

$url_reg = /(ftp|https?):\/\/(\w+:?\w*@)?(\S+)(:[0-9]+)?(\/([\w#!:.?+=&%@!\/-])?)?/;
0
répondu K6t 2013-10-28 10:53:22

S'il n'est pas nécessaire qu'il s'agisse de regex, vous pouvez toujours utiliser les filtres Validate qui sont en PHP.

filter_var('http://example.com', FILTER_VALIDATE_URL);

Filter_var(mixte $variable [, int $filtre = FILTER_DEFAULT [, mixte $options ]]);

Types de Filtres

Valider Les Filtres

-1
répondu Mark Tomlin 2013-10-28 11:03:34