【发布时间】:2012-06-22 18:42:25
【问题描述】:
很遗憾,我不得不问这个问题,但是在整个上午都在思考这个问题之后,我放弃了。在线搜索、手册页、文档,似乎都没有给我一个关于我尝试做什么的决定性答案。
寻找 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”这样的图像名称,但这不是我想要允许的。
【问题讨论】:
-
这对我来说是正确的。您能否包含一个失败的特定代码 sn-p 以及您希望匹配的测试字符串?
-
您需要在示例正则表达式的最后部分之前添加反斜杠吗?
(_MG_|IMG_|DSC_)[0-9]{4}(\-[0-9])?似乎与您的两个示例都匹配。 -
@andrewsi - 反斜杠无关紧要。
-
@Jens - 正则表达式看起来是正确的,所以问题可能出在其他地方。发布您的 PHP 代码。
-
这是习惯的力量——我倾向于避开破折号之类的字符,因为它不会造成伤害并且可能会有所帮助。
标签: php regex pattern-matching