我想在我的代码中使用preg_match(),但结果什么都没有......(或 null 或空?)
$domain = "stackoverflow.com";
$uriToTest = "http://stackoverflow.com/";
$pattern = "/^http(s)?://(([a-z]+)\.)*".$domain."/";
echo preg_match($pattern, $uriToTest);
问题是什么?
我想在我的代码中使用preg_match(),但结果什么都没有......(或 null 或空?)
$domain = "stackoverflow.com";
$uriToTest = "http://stackoverflow.com/";
$pattern = "/^http(s)?://(([a-z]+)\.)*".$domain."/";
echo preg_match($pattern, $uriToTest);
问题是什么?
如果你看看你的模式,就是这个
/^http(s)?://(([a-z]+)\.)*stackoverflow.com/
分隔符用作匹配字符,如果您打开了错误,则会收到“未知修饰符”错误。所以第一个提示:打开错误报告!
要修复它,请尝试使用不同的分隔符,例如,因为它比倾斜的牙签{}
更容易阅读......
{^http(s)?://(([a-z]+)\.)*stackoverflow.com}
另一个问题是点$domain
成为通配符匹配 - 每当您将未知数据插入正则表达式时,养成使用preg_quote转义它的习惯,例如
$pattern = "{^http(s)?://(([a-z]+)\.)*" . preg_quote($domain, '{') . "}";
(注意 - 评论中来自 stema 的好消息:如果您使用不同的分隔符,则必须传递该 preg_quote。它足够聪明地发现成对的分隔符,因此如果您传递{
它也会转义}
。)
$domain = "stackoverflow.com";
$uriToTest = "http://stackoverflow.com/";
$pattern = "^http(s)?://(([a-z]+)\.)*" . $domain . "^";
preg_match($pattern, $uriToTest, $matches);
print_r($matches);
您很可能会收到错误并preg_match
返回 false,因为您没有转义表达式中的正斜杠。要么使用像 a 这样#
的其他东西作为表达式分隔符,要么转义任何正斜杠以阻止解析器尝试结束表达式(/
应该是\/
- 或将/
任一端的 the 更改为#
)
//Quick fix to yours
$pattern = "/^http(s)?:\/\/(([a-z]+)\.)*".preg_quote($domain,'/')."/";
//More legible fix
$pattern = '#^https?://(([a-z]+)\.)*'.preg_quote($domain,'#').'#';
请注意,您不需要在 https 中的 s 周围加上括号(除非您希望捕获它)
您需要转义正斜杠和.
域名中的
$domain = "stackoverflow.com";
$uriToTest = "http://stackoverflow.com/";
$escapedDomain = str_replace('.', '\.', $domain);
$pattern = "/^http(s)?:\/\/(([a-z]+)\.)*".$escapedDomain."/";
echo preg_match($pattern, $uriToTest);
如果您使用的是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);
它会自动为您添加合适的分隔符。