preg_match字符串

时间:2011-10-10 14:56:39

标签: php preg-match

有人可以解释一下这种模式的含义。

preg_match(/'^(d{1,2}([a-z]+))(?:s*)S (?=200[0-9])/','21st March 2006','$matches);

如果我错了,请纠正我:

    ^        = beginning of the line   
    d{1,2}   = digit with minimum 1 and maximum 2 digits  
    ([a-z]+) = one or more letters from a-z
    (?:s*)S  = no idea...  
    (?=      = no idea...
    200[0-9] = a number, starting with 200 and ending with a number (0-9)

有人可以填写此列表吗?

2 个答案:

答案 0 :(得分:2)

regular-exressions.info是非常有用的资源。

/'^(d{1,2}([a-z]+))(?:s*)S (?=200[0-9])/

(?:regex)是非捕获括号;它们在您的示例中不是很有用,但可用于表达(?:bar)+之类的内容,表示1个或更多bar s

(?=regex)做了一个积极的预测,但匹配的位置不是内容。因此,您的示例中的(?=200[0-9])仅使正则表达式与前十年的日期相匹配,没有匹配年份本身。

答案 1 :(得分:2)

这是一个很好的图表,由strfriend提供:

^(d{1,2}([a-z]+))(?:s*)S (?=200[0-9])

但我认为你可能用反斜杠表示^(\d{1,2}([a-z]+))(?:\s*)\S (?=200[0-9]),这会产生this diagram

^(\d{1,2}([a-z]+))(?:\s*)\S (?=200[0-9])

也就是说,此正则表达式匹配字符串的开头,后跟一个或两个数字,一个或多个小写字母,零个或多个空白字符,一个非空白字符和一个空格。此外,所有这些都必须在2000年到2009年之间跟随一个数字,尽管这个数字实际上并不与正则表达式相匹配 - 它只是一个前瞻性的断言。此外,前导数字和字母都会被捕获到$matches[1],而只有$matches[2]中的字母。

有关PHP的PCRE regexp语法的更多信息,请参阅http://php.net/manual/en/pcre.pattern.php