我正在尝试使用PHP函数“preg_match_all”匹配字符串中的url。它工作正常,但它不会匹配带有问号的网址。
例如,这将匹配正常:
http://espn.com/mlb
但这不匹配:
http://espn.com/mlb?player=71
这是我正在使用的正则表达式,
$regexUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
我无法弄清楚为什么问号没有被\ S拿起。我尝试了很多不同的表达方式,无法得到问号以匹配。有任何想法吗?
编辑:
事实证明preg_match_all返回true,但我没有在preg_match_all输出中转义问号,所以我之后创建的preg_replace调用失败了。
答案 0 :(得分:3)
问号表示前一个匹配是可选的,即
/https?/
将导致“http”和“https”匹配。您必须转义问号才能与之匹配。
例如:
/https\?/
现在只匹配“https?”。