PHP正则表达式不会出现问号

PHP正则表达式不会出现问号,php,regex,preg-match-all,Php,Regex,Preg Match All,我试图使用PHP函数preg_match_all来匹配字符串中的URL。它工作正常,只是它不会匹配带有问号的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拾取。我尝试了许

我试图使用PHP函数preg_match_all来匹配字符串中的URL。它工作正常,只是它不会匹配带有问号的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调用失败

问号表示前面的匹配是可选的,即

/https?/
将导致http和https匹配。你必须避开问号才能匹配它

例如:

/https\?/

现在只匹配https?

问号表示前面的匹配是可选的,即

/https?/
将导致http和https匹配。你必须避开问号才能匹配它

例如:

/https\?/

现在将只匹配https?

如果使用不同的正则表达式分隔符,则不必转义所有正向斜杠,例如$regex='@pattern/with/forward/slashes@i“谢谢你的建议。它可以工作,但问号仍然不匹配。@Phil,虽然PHP的PCRE实现肯定具有这种能力,但我倾向于在我的公司中推行斜杠分隔符的标准化,以便在协作和维护期间实现可读性/可发现性。斜杠分隔符可以立即识别为正则表达式,并且转义斜杠的麻烦最小。如果使用不同的正则表达式分隔符,则不必转义所有正向斜杠,例如$regex='@pattern/with/forward/slashes@i“谢谢你的建议。它可以工作,但问号仍然不匹配。@Phil,虽然PHP的PCRE实现肯定具有这种能力,但我倾向于在我的公司中推行斜杠分隔符的标准化,以便在协作和维护期间实现可读性/可发现性。斜杠分隔符可以立即识别为正则表达式,并且转义斜杠的麻烦很小。请重新阅读此问题,因为某些原因,问号与表达式末尾的\S不匹配,这就是问题所在。抱歉,不过我很好奇您所说的不匹配是什么意思。您的意思是preg_match_all没有为匹配返回TRUE,还是可选的$matches参数没有显示与子模式\/\S*匹配的字符串部分?编辑:在我使用PHP5.3.8 preg_match_的机器上,两者都返回TRUE,$matches参数显示预期结果。输出:事实上,我要赞扬你解决了这个问题,因为你的问题让我明白了这一点。比赛前一切都恢复正常。但我在稍后调用preg_replace时没有逃过问号。请重新阅读该问题,因为某些原因问号与表达式末尾的\S不匹配,这就是问题所在。抱歉,尽管我现在很好奇您所说的“不匹配”是什么意思。您的意思是preg_match_all没有为匹配返回TRUE,还是可选的$matches参数没有显示与子模式\/\S*匹配的字符串部分?编辑:在我使用PHP5.3.8 preg_match_的机器上,两者都返回TRUE,$matches参数显示预期结果。输出:事实上,我要赞扬你解决了这个问题,因为你的问题让我明白了这一点。比赛前一切都恢复正常。但我后来打电话给preg_replace时并没有回避这个问题。