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!
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
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.
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
.
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.
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
Essayez quelque chose comme ceci:
.*([\w-]+\.)+[a-z]{2,5}(/[\w-]+)*
Essayez ceci
$url_reg = /(ftp|https?):\/\/(\w+:?\w*@)?(\S+)(:[0-9]+)?(\/([\w#!:.?+=&%@!\/-])?)?/;
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 ]]);