你能用PHP解释/简化这个正则表达式(PCRE)吗?

时间:2013-05-17 14:15:23

标签: php regex pcre

preg_match('/.*MyString[ (\/]*([a-z0-9\.\-]*)/i', $contents, $matches);

我需要调试这个。我很清楚它在做什么,但由于我从来不是正则表达的专家,我需要你的帮助。

你能告诉我一块一块地做什么(所以我可以学习)?

语法是否可以简化(我认为没有必要用斜杠转义点)?

2 个答案:

答案 0 :(得分:3)

正则表达式......

'/.*MyString[ (\/]*([a-z0-9\.\-]*)/i'

.*匹配任何字符零次或多次

MyString匹配该字符串。但是您使用不区分大小写的匹配,因此匹配的字符串将拼写为“mystring”但是具有任何大小写

编辑:(感谢Alan Moore)[ (\/]*。这与任何字符space (/重复零次匹配。正如艾伦指出/的最终逃脱是阻止/被视为正则表达式分隔符。

编辑:( 需要转义,.(感谢AlexV)也不会因为:

  

除了\, - ,^(开头)和之外的所有非字母数字字符   终止]在字符类中是非特殊的,但它没有   他们逃脱时会受到伤害。    - http://www.php.net/manual/en/regexp.reference.character-classes.php

连字符通常需要进行转义,否则会尝试定义范围。例如:

[A-Z]  // matches all upper case letters of the aphabet
[A\-Z] // matches 'A', '-', and 'Z'

然而,如果连字符位于列表的末尾,你可以逃脱而不逃避它(但总是最好习惯逃避它......我被这个抓住了。)

([a-z0-9\.\-]*)匹配包含字符a到z的任何字符串(再次注意这是由不区分大小写的匹配),0到9,一个点,一个连字符,重复零次多次。周围的()捕获此字符串。这意味着$matches[1]将包含[a-z0-9\.\-]*的字符串匹配项。括号()告诉preg_match“捕获”此字符串。

e.g。

<?php
  $input = "aslghklfjMyString(james321-james.org)blahblahblah";
  preg_match('/.*MyString[ (\/]*([a-z0-9.\-]*)/i', $input, $matches);
  print_r($matches);
?>

输出

Array
(
    [0] => aslghklfjMyString(james321-james.org
    [1] => james321-james.org
)

请注意,因为您使用不区分大小写的匹配...

$input = "aslghklfjmYsTrInG(james321898-james.org)blahblahblah";

也会在$matches[1]

中匹配并给出相同的答案

希望这会有所帮助......

答案 1 :(得分:1)

让我们逐步分解,从表达式中删除解释的部分。

"/.*MyString[ (\/]*([a-z0-9\.\-]*)/i"

让我们首先剥离正则表达式分隔符(/ i在结尾意味着它不区分大小写):

".*MyString[ (\/]*([a-z0-9\.\-]*)"

然后我们有一个通配符预测(在我们匹配下一个语句之前,任意次数搜索任何符号。

"MyString[ (\/]*([a-z0-9\.\-]*)"

然后按字面意思匹配'MyString',接着是以下任何一个数字(注意'*'):'','(','/'。这可能是错误区域,你需要逃避'('。试试[(/]。

"([a-z0-9\.\-]*)"

然后我们获得以下任意数量的捕获组:a-z文字,0-9位数字,'。'或' - '。

这几乎就是全部。