你能解释/简化PHP中的正则表达式(PCRE)吗?


Can you explain/simplify this regular expression (PCRE) in PHP?

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

我需要调试这个。我很清楚它在做什么,但是因为我从来都不是正则表达式方面的专家,所以我需要你的帮助。

你能逐块告诉我它是做什么的吗(这样我就可以学习了)?

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

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

.*匹配任何字符0次或0次以上

MyString匹配该字符串。但是你使用的是不区分大小写的匹配,所以匹配的字符串将拼写为"mystring",但带有任何大写

编辑:(感谢Alan Moore) [ ('/]*。这匹配任何字符space (/重复零或多次。正如Alan指出的,/的最后一个转义是为了防止/被当作regexp分隔符。

编辑:(需要转义,也不.(感谢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"捕获"这个字符串。

<?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]

给出相同的答案

希望对您有所帮助....

让我们一步一步地分解它,从表达式中删除已解释的部分。

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

让我们首先去掉正则分隔符(末尾的/i表示它不区分大小写):

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

然后我们有一个通配符提前查找(搜索任何符号任意次数,直到我们匹配下一个语句。

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

然后逐字匹配'MyString',后面跟着以下任意数字(注意'*'):' ','(','/'。这可能是错误区域,您需要转义'('。Try [(/].

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

然后我们得到一个捕获组,包含以下任意数字:a-z字面值,0-9位数字,'。',或'-'.

差不多就这些了