Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP正则表达式中使用“^”和“$”时出现意外结果?_Php_Regex_Preg Match - Fatal编程技术网

在PHP正则表达式中使用“^”和“$”时出现意外结果?

在PHP正则表达式中使用“^”和“$”时出现意外结果?,php,regex,preg-match,Php,Regex,Preg Match,可能重复: 我一点也不擅长正则表达式,我知道它们非常重要,但我从来没有找到时间来研究它们。无论如何,我只是想确保,在这些字符串中: MAX_AGE_60 MAX_AGE_80 ... MAX_AGE_X 如果更多的X通常是一个整数,至少会找到一个匹配项,并获取数字X。根据PHP文档中的示例,我编写了以下内容: // Starts and ends with the literal 'MAX_AGE_' followed by a group that is a // number with

可能重复:

我一点也不擅长正则表达式,我知道它们非常重要,但我从来没有找到时间来研究它们。无论如何,我只是想确保,在这些字符串中:

MAX_AGE_60
MAX_AGE_80
...
MAX_AGE_X
如果更多的
X
通常是一个
整数
至少会找到一个匹配项,并获取数字
X
。根据PHP文档中的示例,我编写了以下内容:

// Starts and ends with the literal 'MAX_AGE_' followed by a group that is a 
// number with at least one digit. Case insensitive
$pattern = '/^MAX_AGE_(?P<max>\d+)$/i';

$test    = 'MAX_AGE_80';
$matches = array();

preg_match($pattern, $test, $matches);
var_dump($matches);
删除开始/结束分隔符(
^
$
)会得到正确的结果:

array (size=3)
  0     => string 'MAX_AGE_80' (length=10)
  'max' => string '80' (length=2)
  1     => string '80' (length=2)

那么为什么我不能强制字符串必须以这种模式开始和结束呢?如何解释结果数组?我的意思是索引
0
1
max

我不确定你在括号里做什么。试试这个:

$pattern = '/^MAX_AGE_[\p{N}]+$/iu';
^$和not之间的区别在于,它们只标记行的开头和/或结尾处的匹配项

您可以使用此网站测试表达式(非unicode): 尝试使用

$pattern = '/^MAX_AGE_(?P<max>\d+)\s*$/i';
$pattern='/^MAX_年龄(?P\d+)\s*$/i';

因为行尾前可能有空格。

在您的特定情况下,
^
$
可以保留在正则表达式中,如果您还使用了
/m
修饰符使这两个多行都可以识别。我在有/没有
^
$
的情况下得到了预期的结果。问题出在哪里?@SalmanA不能处理第一个(使用
^
$
),删除它们就可以了。为什么?^和$告诉正则表达式,^是行的开始,$是行的结束。如果要使用单词边界,请改用\b(regex)\b。嗯……我不认为这太复杂。。。1.问题不在于
^
$
的功能是什么,而是它们为什么不能按预期工作。2.关于命名子模式的输出的问题尚未回答(简短回答:索引0是完整的匹配字符串,所有其他数字索引都与子模式匹配,额外的preg_match为您提供与命名模式的匹配,名称为索引)。很抱歉,我没有很好地阅读您的问题。试试这个:
$pattern='/MAX\u AGE([\p{N}]+)?/ium'
并使用
preg\u match\u all
(它返回一个数组,在php文档中在线查找)我确信我的测试字符串将始终包含最多1个匹配项,所以为什么我要使用preg\u match\u all?哦,抱歉,这不是很清楚。如果你确定只有一个匹配,那么你不需要使用preg\u match\u all。我以为你想至少抓到一场比赛。关于你的问题,你的字符串不仅仅是一行。Regexp引擎将搜索整个文本块,因此模式(为一行设计)将与多行不匹配。
$pattern = '/^MAX_AGE_(?P<max>\d+)\s*$/i';