我想在我的代码中创建一个preg_match,但结果是什么......(或null或为空?)
$domain = "stackoverflow.com";
$uriToTest = "http://stackoverflow.com/";
$pattern = "/^http(s)?://(([a-z]+)\.)*".$domain."/";
echo preg_match($pattern, $uriToTest);
有什么问题?
答案 0 :(得分:3)
如果你看看你的模式,就是这个
/^http(s)?://(([a-z]+)\.)*stackoverflow.com/
分隔符用作匹配字符,如果您启用了错误,则会出现"Unknown modifier"错误。首先提示:TURN ERROR REPORTING ON!
要解决此问题,请尝试使用其他分隔符,例如{}
,因为它比leaning toothpicks ...
{^http(s)?://(([a-z]+)\.)*stackoverflow.com}
另一个问题是$domain
中的点变为通配符匹配 - 只要您将未知数据插入正则表达式,就习惯使用preg_quote来逃避它,例如。
$pattern = "{^http(s)?://(([a-z]+)\.)*".preg_quote($domain, '{')."}";
(注意 - 在评论中很好地捕获stema:如果你使用不同的分隔符,你必须传递preg_quote。它足够聪明地发现成对的分隔符,所以如果你通过{
它也会逃脱{{} 1}})
答案 1 :(得分:0)
被修改
$domain = "stackoverflow.com";
$uriToTest = "http://stackoverflow.com/";
$pattern = "^http(s)?://(([a-z]+)\.)*".$domain."^";
preg_match($pattern, $uriToTest,$matches);
print_r($matches);
$uriToTest = "http://stackoverflow.com/";
$pattern = "^http(s)?://(([a-z]+)\.)*".$domain."^";
preg_match($pattern, $uriToTest,$matches);
print_r($matches);
答案 2 :(得分:0)
您最有可能收到错误并且preg_match
返回false,因为您没有在表达式中转义正斜杠。使用像#
之类的其他内容作为表达式分隔符或转义任何正斜杠以阻止解析器尝试结束表达式(/
应该是\/
- 或更改{{1在两端都是/
)
#
请注意,https中的s周围不需要括号(除非您希望捕获它)
答案 3 :(得分:0)
您需要转义正斜杠和域名中的.
$domain = "stackoverflow.com";
$uriToTest = "http://stackoverflow.com/";
$escapedDomain = str_replace('.', '\.', $domain);
$pattern = "/^http(s)?:\/\/(([a-z]+)\.)*".$escapedDomain."/";
echo preg_match($pattern, $uriToTest);
答案 4 :(得分:0)
如果您使用的是T-Regx,则将立即引发此异常:
$domain = "stackoverflow.com";
$uriToTest = "http://stackoverflow.com/";
try
{
pattern("/^http(s)?://(([a-z]+)\.)*" . $domain . '/')->match($uriToTest);
}
catch (SafeRegexException $e) {
echo $e->getMessage(); // `Unknown modifier '/'`
}
而且!! T-Regx可以自动添加定界符,因此您可以
pattern("^http(s)?://(([a-z]+)\.)*" . $domain)->match($uriToTest);
,它将自动为您添加一个合适的定界符(尚未使用的定界符)。