正则表达式中的替代字符串

时间:2012-06-22 18:42:25

标签: php regex pattern-matching

可悲的是,我不得不问这个问题,但整个上午在解决这个问题后,我放弃了。在线搜索,手册页,文档,似乎都没有给我一个确定的答案,我试图做。

寻找PHP函数preg_match的正则表达式,以匹配模式的字符串。现在这种模式令我感到头疼。

模式应表示以下内容:字符串以“_MG_”或“IMG_”或“DSC_”开头,后跟四位数字,后跟可选的“-N”,其中N是另一个数字。例如,“IMG_0123”或“DSC_9876-3”有效。其他一切都应该被拒绝。

我提出了各种各样的模式,但它们似乎都不起作用。例如,我试过

(_MG_|IMG_|DSC_)[0-9]{4}(-[0-9])?

这与不同的变体与()和撇号围绕各种子表达式和使用? vs {0,1}和诸如此类的。 (我尝试使用grep,但仍然没有匹配。)是的,我知道我需要为PHP添加“/.../”,但是为了便于阅读,我把它留了出来。

我是否可以在单个表达式中表达,或者我是否必须多次调用匹配函数?如果需要几个匹配,我可能最好为这个与我匹配的特定字符串编写一个小解析器。

谢谢!

编辑:这是我正在使用的代码

// Iterate over all images in this gallery folder.
if ($h = opendir($dir)) {
  while (($f = readdir($h)) !== false) {

    // Skip images whose name doesn't match the requirement.
    if (0 == preg_match("/(_MG_|IMG_|DSC_)[0-9]{4}(-[0-9]){0,1}/", $f)) {
      continue;
    }

    ...
  }
}

这也允许图像名称,如“_MG_7020-1-2.jpg”或“_MG_7444-5-6.2.jpg”或“IMG_6543_2_4_tonemapped.jpg”,但这不是我想要允许的。

3 个答案:

答案 0 :(得分:0)

<?php

    $array = array('IMG_0123', 'DSC_9876-3', '_MG_1234', 'DSC_fail');

    foreach($array as $arr) {
        if(preg_match("/_MG_|IMG_|DSC_[0-9]{4}[-0-9]*/", $arr)) {
            echo $arr . ' => TRUE <br />';
        } else {
            echo $arr . ' => FALSE <br />';
        }
    }
?>

以上工作对我来说是预期的。

答案 1 :(得分:0)

我也跑了这个:

<?php
$matches = array();
preg_match('/(_MG_|IMG_|DSC_)[0-9]{4}(-[0-9])?/','IMG_0123-3',$matches );

var_dump($matches);

输出:

array(3) {
  [0]=>
  string(10) "IMG_0123-3"
  [1]=>
  string(4) "IMG_"
  [2]=>
  string(2) "-3"
}

似乎没问题,除非我遗漏了什么,或者除非你所指的是preg_match如果不是所有匹配器()都匹配,则返回false。

请注意php doc中的preg_match的返回类型:

  

preg_match()返回模式匹配的次数。这将是0次(不匹配)或1次,因为preg_match()将在第一次匹配后停止搜索。相反,preg_match_all()将一直持续到主题结束。如果发生错误,preg_match()返回FALSE。

所以你可能真的想要实际使用preg_match_all()

答案 2 :(得分:0)

According to this refiddle,你似乎解决得很好。您可以使用其“单元”测试功能,另外“应该”和“不应该”匹配方案。当然,这个改装是使用javascript的正则表达式,但我发现它们实际上是完全相同的,直到你进入反向引用和外观。