我必须承认我从未习惯使用正则表达式,但是最近我遇到了一个问题,即使用正则表达式来解决问题会更加困难。我需要能够在字符串的开头匹配以下模式的任何内容:
{any_url_safe_word}
+("/http://"
|| "/https://"
|| "www."
)+ {any word}
。
所以以下内容应该匹配:
cars/http://google.com#test
cars/https://google.com#test
cars/www.google.com#test
以下内容不应该匹配:
cars/httdp://google.com#test
cars/http:/google.com#test
我到目前为止尝试的是:^[\w]{1,500}\/[(http\:\/\/)|(https:\/\/])|([www\.])]{0,50}
,但是匹配来自cars/http
的{{1}}。
答案 0 :(得分:3)
这个正则表达式可以做到:
^[\w\d]+\/(?:https?:\/\/)?(?:www\.)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}
如果你想获得它之后的所有内容,你可以直接添加(.*)
......
由于似乎或多或少一般的网址安全字词列表包含ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
Source
,您也可以将其包含在内,因此您将获得(简化后):
^[!#$&-.0-;=?-\[\]_a-z~]+\/(?:https?:\/\/)?(?:www\.)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}
答案 1 :(得分:0)
<?php
$words = array(
'cars/http://google.com#test',
'cars/https://google.com#test',
'cars/www.google.com#test',
'cars/httdp://google.com#test',
'cars/http:/google.com#test',
'c a r s/http:/google.com#test'
);
foreach($words as $value)
{
/*
\S+ - at least one non-space symbol
\/ - slash
(https?:\/\/) - http with possible s then ://
| - or
(www\.) - www.
.+ - at least one symbol
*/
if (preg_match('/^\S+\/(https?:\/\/)|(www\.).+/', $value))
{
print $value. " good\n";
}
else
{
print $value. " bad\n";
}
}
打印:
cars/http://google.com#test good
cars/https://google.com#test good
cars/www.google.com#test good
cars/httdp://google.com#test bad
cars/http:/google.com#test bad
c a r s/http:/google.com#test bad
答案 2 :(得分:0)
查看demo。
[a-z0-9-_.~]+/(https?://|www\.)[a-z0-9]+\.[a-z]{2,6}([/?#a-z0-9-_.~])*
编辑:将@ CD001评论记入帐户。如果您不注意区分大小写,请务必使用i
修饰符。