0

我一直在参考http://www.regular-expressions.info/reference.html,但是我无法理解我的正则表达式如何无法成功。

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;
}
4

2 回答 2

0

表达方式不对

/^[a-zA-Z]+[a-zA-Z()\. ]?+[a-zA-Z)]?+$/

你是说:字符串开头后跟一个字母(任何大小写)一次或多次,然后是(可选字母括号点或空格)一次或多次,然后是(可选字母或括号)一次或多次然后字符串的结尾。

不太清楚它是如何变得 LLuffy 的,但 ?+ 只是......毫无意义,评论或编辑你想要匹配的内容,我会告诉你。

于 2013-08-27T02:50:58.140 回答
0

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

是的,因为PHP 文档

重复由量词指定,可以跟在以下任何一项之后:

  • 单个字符,可能已转义
  • 这 。元字符
  • 一个字符类
  • 反向引用(见下一节)
  • 一个带括号的子模式(除非它是一个断言 - 见下文)

+ 作为量词不能跟在重复后面[...]?,因为这不是上面的任何一项。相反(正如 HamZa 正确指出的那样)?+是根据以下解释的:

后跟 + 的量词是“所有的”。他们吃尽可能多的字符,并且不会返回以匹配模式的其余部分。

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

于 2014-08-25T12:21:38.990 回答