3

我想在我的代码中使用preg_match(),但结果什么都没有......(或 null 或空?)

$domain = "stackoverflow.com";

$uriToTest = "http://stackoverflow.com/";

$pattern = "/^http(s)?://(([a-z]+)\.)*".$domain."/";

echo preg_match($pattern, $uriToTest);

问题是什么?

4

5 回答 5

3

如果你看看你的模式,就是这个

/^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。它足够聪明地发现成对的分隔符,因此如果您传递{它也会转义}。)

于 2013-07-24T10:05:00.200 回答
0
  $domain = "stackoverflow.com";

  $uriToTest = "http://stackoverflow.com/";

  $pattern = "^http(s)?://(([a-z]+)\.)*" . $domain . "^";

  preg_match($pattern, $uriToTest, $matches);
  print_r($matches);
于 2013-07-24T10:02:38.453 回答
0

您很可能会收到错误并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 周围加上括号(除非您希望捕获它)

于 2013-07-24T10:03:57.250 回答
0

您需要转义正斜杠和.域名中的

$domain = "stackoverflow.com";

$uriToTest = "http://stackoverflow.com/";

$escapedDomain = str_replace('.', '\.', $domain);

$pattern = "/^http(s)?:\/\/(([a-z]+)\.)*".$escapedDomain."/";

echo preg_match($pattern, $uriToTest);
于 2013-07-24T10:06:23.293 回答
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);

它会自动为您添加合适的分隔符。

于 2018-10-09T13:48:48.067 回答