preg匹配名称不是preg_matching

时间:2013-08-27 02:20:46

标签: php regex

我一直指的是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;
}

2 个答案:

答案 0 :(得分:0)

表达方式是对的,

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

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

不太确定如何获得LLuffy,但是?+只是......毫无意义,回复或编辑你想要匹配的东西,我会告诉你。

答案 1 :(得分:0)

  

问题解决了,但是我试图做[]?的问题(我   认为)在?+

之前匹配[]?的php

是的,因为PHP documentation

  

重复由量词指定,它可以跟随任何一个   以下项目:

     
      
  • 单个字符,可能已转义
  •   
  • 。元字符
  •   
  • 一个角色类
  •   
  • 后退参考(参见下一节)
  •   
  • 带括号的子模式(除非是断言 - 见下文)
  •   

+ 作为量词无法遵循重复[...]?,因为这不是上述任何内容。而是(正如HamZa正确陈述的那样)?+根据这个来解释:

  

量词跟随+是“占有欲”。他们吃多少   字符尽可能不返回以匹配其余部分   图案。

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