理解preg_match()的问题

时间:2014-05-03 20:30:25

标签: php regex preg-match

我希望能够搜索之前由strtoupper()大写的特定代码(最多三个字母)以确保正确性。我希望搜索能够找到第一个角色成为" C"然后最后一个字符是以下之一:L,M,P,C,BC或RC。因此,我实际上希望搜索CL,CM,CP,CC,CBC或CRC。

我有以下内容:

// Make sure designation code is entered
   if (empty($designation)) {
     echo "<p class='error'>ERROR:  Designation code is required</p>";
     $valid = false; }
// Make sure designation code is not too long (3 characters)
   if (strlen($designation)>3) {
     echo "<p class='error'>ERROR:  Designation code cannot be more than 3 characters</p>";
  $valid = false; }
// Convert designation code to all uppercase
   $designation = strtoupper($designation);
// Make sure designation code is valid
   if (preg_match("/(CL|CM|CP|CC|CBC|CRC)/",$designation))  {
     echo "<p class='error'>ERROR:  Designation code not correct</p>";
     $valid = false; }

一切都可以达到preg_match();没有任何反应的地方。我可以输入任何字母,它会接受它为有效。

我也尝试了以下内容,但我认为这不正确:

if (preg_match("/^C[L|M|P|C|BC|CR]/",$designation)){
    echo "<p class='error'>ERROR:  Designation code not correct</p>";
    $valid = false; }

5 个答案:

答案 0 :(得分:0)

你可以尝试

if (preg_match("/(C(L|M|P|C|BC|RC))/i",$designation)) {
     echo "<p class='error'>ERROR:  Designation code not correct</p>";
$valid = false; 
}

事实是,如果你正在寻找整个文本,你将需要preg_match_all,因为php不支持/ g修饰符

答案 1 :(得分:0)

两件重要的事情。

正则表达式部分:

 /^C(L|M|P)/i

表示匹配以C开头,后跟L或M或P的任何内容,与案例&#39;匹配,[]表示范围,而不是一组备选方案

php部分:

preg_match在匹配时返回1。非匹配时为0,错误时为false。如果你想明确无误,你的测试应该是这样的

if(preg_match($pattern,$subject) === 1)
{
}

在您的代码示例中,以下内容应该可以正常工作

 if (preg_match('/^C(L|M|P|C|BC|RC)/i',$designation) === 1)  
 {
      echo "<p class='error'>ERROR:  Designation code not correct</p>";
      $valid = false; 
 }

答案 2 :(得分:0)

据我了解你的问题,你的逻辑是倒退的。如果代码为CL等,您希望接受它,而不是拒绝它。换句话说,只有preg_match()返回false时才应拒绝它。只需在致电!之前添加preg_match()即可撤销if条件,如下所示:

// Make sure designation code is valid
if (!preg_match("/(CL|CM|CP|CC|CBC|CRC)/",$designation))  { //notice the ! inside the parentheses
    echo "<p class='error'>ERROR:  Designation code not correct</p>";
    $valid = false;
}

如果我误解了您的要求,请告诉我。

此外,正如其他人所指出的,您可以使用i标记来避免调用strtoupper()。如果您只想接受上面列出的代码而不是FCL,请分别在正则表达式正文之前和之后添加^$。除非您只是想显示有关代码长度的错误,否则这也会使您的strlen检查变得不必要。这将使您的整个代码看起来像这样:

// Make sure designation code is entered
if (empty($designation)) {
    echo "<p class='error'>ERROR:  Designation code is required</p>";
    $valid = false;
}
// Make sure designation code is not too long (3 characters)
// NOTE: This block is now optional
if (strlen($designation)>3) {
    echo "<p class='error'>ERROR:  Designation code cannot be more than 3 characters</p>";
    $valid = false;
}

// Make sure designation code is valid
if (!preg_match("/^(CL|CM|CP|CC|CBC|CRC)$/i",$designation))  { //notice the ! inside the parentheses
    echo "<p class='error'>ERROR:  Designation code not correct</p>";
    $valid = false;
}

答案 3 :(得分:0)

谢谢大家的帮助。通过所有输入,我能够理解发生了什么。至于我的代码,以下工作完美:

if (!preg_match('/C(L|M|P|C|BC|RC)/',$designation)) {
    echo "<p class='error'>ERROR:  Designation code not correct;
$valid = false;

让preg_match()寻找除列表中的内容以外的东西是我所缺少的。这将查找代码的第一个字母为&#34; C&#34;其余的是列表中的一个选择。另外,我没有要求i忽略大小写,因为我已经使用strtoupper()来大写此字段的任何输入。现在,如果输入的内容不在列表中,则会显示错误消息。

答案 4 :(得分:-1)

/^((CL)|(CM)|(CP)|(CC)|(CBC)|(CRC))/i

尝试使用http://www.regexr.com/来使用RegExps。 选项«i»表示忽略大小写。不需要strtoupper。