PHP-PCRE的问题

PHP-PCRE的问题,php,regex,preg-match,pcre,Php,Regex,Preg Match,Pcre,我对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_m

我对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");
}

我想如果你的号码只用逗号隔开,像这样的东西就可以了

$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}$';

我想如果你的号码只用逗号隔开,像这样的东西就可以了

$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}$';

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

$pattern = '/some pattern/';
以匹配开始处的“^”和结尾处的“$”所需的全部内容。这可能是您的
sdf
匹配的原因

$pattern = '/^whole pattern match$/';
这些数字是如何分开的,这有点让人困惑。是逗号还是空格?都可以吗?没有呢?这是我最好的猜测

$pattern = '/^\d{,5}[, ](\d{,5}[, ]){,9}$/';

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

$pattern = '/some pattern/';
以匹配开始处的“^”和结尾处的“$”所需的全部内容。这可能是您的
sdf
匹配的原因

$pattern = '/^whole pattern match$/';
这些数字是如何分开的,这有点让人困惑。是逗号还是空格?都可以吗?没有呢?这是我最好的猜测

$pattern = '/^\d{,5}[, ](\d{,5}[, ]){,9}$/';

我假设如下:

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

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

有效。

我假设如下:

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

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

有效。

据我所见,您提供的正则表达式将匹配您传递给它的任何内容。原因如下

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

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

从我看到的情况来看,您提供的正则表达式将匹配传递给它的任何内容。原因如下

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

因此,正则表达式本质上是短路。引擎看到字符串的第一个字符,就会说“一个数字重复了0次吗?”?对好的,这是一场比赛

@WAI933:您的主要问题是您的正则表达式以“^”结尾而不是$Asaph,胡萝卜被用作正则表达式的分隔符。不过,考虑到可读性,这不是最佳选择。@WAI933:您的主要问题是您的正则表达式以“^”结尾而不是$Asaph,胡萝卜被用作正则表达式的分隔符。但考虑到可读性,这不是最好的选择。您可能应该在模式中包含
/…/
分隔符。您可能应该在模式中包含
/…/
分隔符。^被用作两个相等的符号。哇,这真是误导。^被用作两个相等的符号。哇,这真是误导。