0

我在使用 PHP PCRE 时遇到问题,而且我已经习惯了 POSIX,所以我不太确定自己做错了什么。基本上,这个函数最多匹配 10 个用逗号分隔的数字。但是,它也匹配字符串sdf(可能还有许多其他字符串),我看不出原因。谁能帮我?

$pattern='^\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?\d{0,5},? ?^';

$leftcheck=preg_match($pattern, $leftmodules);
$centercheck=preg_match($pattern, $centermodules);
$rightcheck=preg_match($pattern, $rightmodules);

if(!$leftcheck OR !$centercheck OR !$rightcheck)
{
$editpage = $_SERVER['HTTP_REFERER'].'?&error=1';
die("Location:$editpage");
}
4

5 回答 5

3
^\d{1,5}(, *\d{1,5}){0,9}$
于 2009-10-14T03:36:58.797 回答
1

我假设以下内容:

  • 空间可能存在也可能不存在。
  • 数字可以是任意长度。
  • 只允许使用数字、空格和逗号。
  • 允许在逗号后面不带数字的尾随逗号。
  • 用逗号分隔的 1 到 10 个数字都可以。

鉴于:

$pattern = '/^(\d+,* *){1,10}$/';

作品。

于 2009-10-14T04:22:47.360 回答
1

据我所知,您提供的正则表达式将匹配您传递给它的任何内容。这就是为什么

\d{0,5}     #\d matches any digit character, while {0,5} means the
            #preceding character must be repeated between **0** and five times

所以你的正则表达式本质上是短路的。引擎看到你的字符串的第一个字符并说“一个数字重复了 0 次?是的?好的,它是匹配的!

于 2009-10-14T06:54:09.337 回答
0

我认为如果您的号码仅用逗号分隔,则应该这样做

$pattern = '^\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5},\d{0,5}$';
于 2009-10-14T03:34:06.553 回答
-1

您需要包含两个相等符号之间的模式才能使其有效。人们通常使用/。

$pattern = '/some pattern/';

为了匹配你想要在开头有 ^ 和最后有 $ 的整个东西。弄错这个可能是你sdf匹配的原因。

$pattern = '/^whole pattern match$/';

如何分隔数字有点令人困惑。是逗号还是空格?两者都好吗?没有怎么办?这是我最好的猜测。

$pattern = '/^\d{,5}[, ](\d{,5}[, ]){,9}$/';
于 2009-10-14T03:47:03.843 回答