检查包含多个单词和数字的字符串

时间:2019-06-28 13:14:51

标签: php regex

我有一个php文件,该文件将用户重定向到正确的用户手册,具体取决于他单击的链接。 由于我们有很多手册(有些是以前的版本,我们需要与最新版本匹配),所以我不得不使用REGEX来查找所需的内容。

让我们以水果为例。在商店中,我们有一些手动名称,如下所示:

$manuals = [
    'dc-cn-13apple-frv4-5.pdf',
    'dc-cn-33_banana-strawberryv10-108.pdf',
    'dc-cn-32peachenv10-125.pdf',
    'dc-cn-23lemoncoconutwatermelonitv09-130.pdf'
];

所以有很多可能的组合,重要的是它们总是以'dc-cn-'开头,然后是对我们很重要的2位数字(就像水果的参考文献一样。)

接着用一些单词来描述水果,紧接着是2个字母以使用本手册所用的语言来知道水果,并以'v08'或'v10'来知道版本。有时版本的那两个字母和数字带有破折号(例如'-frv4')。

最后,它们总是以随机的3位数字结尾(由我们使用的CMS自动给出),后跟“ .pdf”。

我试图像这样操纵数组:

foreach ($manuals as $manual) {
    if(preg_match('/^[0-9][0-9][\.]pdf$/', $manual)) {
        echo 'OK';
    }
}

但是到目前为止,我的REGEX仍然不匹配,我真的感觉自己对自己的工作一无所知。

能够检查第一个数字('dc-cn- 32 ','dc-cn- 13 ')和2单词末尾的字母(“- fr v4”,“ peach en v10”或“ melon it v09-130.pdf” )和最后3位数字(“ melonitv09- 130 .pdf”)。

然后我将全部preg_split并开始进行比较。

1 个答案:

答案 0 :(得分:1)

您的示例不一定符合您的描述,但是根据描述,此正则表达式应该有效(不过未经测试):

^dc-cn-\d{2}[a-zA-Z_\-]+-?\w{2}v\d+-\d{3}\.pdf$

说明:

  • ^dc-cn-从字符串开头匹配您的前缀
  • 后跟\d{2}-一个两位数的数字
  • 后跟[a-zA-Z_\-]-由1个或多个字母,连字符或下划线组成的字符串(来自您的示例)
  • 后跟-?-可能存在或可能不存在的破折号
  • 后跟\w{2}-两个字母的语言代码
  • 后跟v\d+-字母 v 和数字
  • 后跟-\d{3}-3位数的CMS号码
  • 后跟\.pdf$-字面意思是字符串末尾的 .pdf

更新:如果最后一个CMS号并不总是3位数字,而是1或2位数字(例如,如上述示例中的一个,则正则表达式将变为

^dc-cn-\d{2}[a-zA-Z_\-]+-?\w{2}v\d+-\d{1,3}\.pdf$