Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.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

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 - Fatal编程技术网

Php 预匹配名称未预匹配

Php 预匹配名称未预匹配,php,regex,Php,Regex,我一直在说,但是我不明白我的正则表达式是如何无法成功的 function is_name($Argv){ $RegExp='/^[a-zA-Z]+[a-zA-Z()\. ]?+[a-zA-Z)]?+$/'; return preg_match($RegExp,$Argv)?$Argv:false; } 我正在尝试使名称字母表开始,中间的一些符号或空格是可选的,末尾的“')可用 $testArray=array('L','D Luffy','Luffy','Monkey D. L

我一直在说,但是我不明白我的正则表达式是如何无法成功的

function is_name($Argv){
    $RegExp='/^[a-zA-Z]+[a-zA-Z()\. ]?+[a-zA-Z)]?+$/';
    return preg_match($RegExp,$Argv)?$Argv:false;
}
我正在尝试使名称字母表开始,中间的一些符号或空格是可选的,末尾的“')可用

$testArray=array('L','D Luffy','Luffy','Monkey D. Luffy','Choppa(fiftyB)');
foreach($testArray as $key=>$value)
echo $auth->check->is_name($value); //output 'LLuffy'
结果表明,只有“L”和“Luffy”可以接受,但不匹配可选的中间空间。我不能选择中间选项,因为我必须匹配“L”


更新

问题解决了,这是我试图做的
[]?
的问题,但是(我认为)php在做
[]?
之前匹配
?+

function is_name($Argv){
    $RegExp='/^[a-zA-Z]+([a-zA-Z()\. ]?)+([a-zA-Z)]?)+$/';
    return preg_match($RegExp,$Argv)?$Argv:false;
}

这个表达不正确

/^[a-zA-Z]+[a-zA-Z()\. ]?+[a-zA-Z)]?+$/
你是说: 字符串开头后跟字母(任意大小写)一次或多次,后跟(可选字母括号点或空格)一次或多次,后跟(可选字母或括号)一次或多次,然后是字符串结尾

不太清楚它是怎么变硬的,但是?+只是。。。毫无意义,用你想要匹配的内容进行评论或编辑,我会告诉你

问题解决了,这就是我试图解决的问题 在执行
[]?

function is_name($Argv){
    $RegExp='/^[a-zA-Z]+([a-zA-Z()\. ]?)+([a-zA-Z)]?)+$/';
    return preg_match($RegExp,$Argv)?$Argv:false;
}
是的,因为

重复是由量词指定的,量词可以跟在 下列项目:

  • 单个字符,可能已转义
  • 这个。元字符
  • 人物类
  • 反向参考(见下一节)
  • 带括号的子模式(除非是断言-请参见下文)
作为量词的
+
不能跟在重复的
[…]?
后面,因为这不是上面的项目。相反(正如哈姆扎正确地指出的)
?+
是根据以下内容进行解释的:

后跟+的量词是“所有格”。他们吃同样多的食物 尽可能多的字符,并且不返回以匹配 模式


因此,对于模式
/^[a-zA-Z]+[a-zA-Z()\.]?+[a-zA-Z]+$/
和主题
D Luffy
[a-zA-Z]+
匹配
D
[a-zA-Z()\.]匹配空格,而
[a-zA-Z]+
只匹配
L
,不是整个
Luffy

那不是语法错误。
?+
不是一个有用的量词组合。是的,它不是语法错误(刚刚发现)马里奥你是对的!我已更改为
?)+
,现在可以使用了!它是否应该忽略未闭合的括号,例如
“Hello(world)”
表示匹配先前标记零次或一次,向其添加加号
?++
是不同的,在这种情况下,
+
是一个所有格量词。所有格量词对性能很有用,它将阻止引擎尝试回溯不同的排列。从一个o必须完成小学学业(根据你的说法):-)@HamZa我不知道你在说什么,+?是惰性匹配,+默认情况下是贪婪的?是1或0次,即可选。您提到的
后面跟一个(可选的字母括号点或空格)一次或多次
“一次或多次”不正确。从和中了解所有格量词。@HamZa不在POSIX正则表达式中没有,阅读关于有限状态自动机的内容可以显示所有正则表达式规则都映射到状态机,但不是以其他方式,PERL事物和其他附加内容会改变状态机,请参阅Flex(快速词法分析器)对于状态机相对于Perl的解释的改进,我确实赞同Perl的正则表达式,但只有在问题中提到时,我才同意。我不是跟踪,只是碰巧您回答了我经常遇到的一个正则表达式/php问题。但我在这里结束了。