preg_match('/.*MyString[ ('/]*([a-z0-9'.'-]*)/i', $contents, $matches);
我需要调试这个。我很清楚它在做什么,但是因为我从来都不是正则表达式方面的专家,所以我需要你的帮助。
你能逐块告诉我它是做什么的吗(这样我就可以学习了)?
是否可以简化语法(我认为没有必要用斜杠转义点)?
'/.*MyString[ ('/]*([a-z0-9'.'-]*)/i'
.*
匹配任何字符0次或0次以上
MyString
匹配该字符串。但是你使用的是不区分大小写的匹配,所以匹配的字符串将拼写为"mystring",但带有任何大写
[ ('/]*
。这匹配任何字符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位数字,'。',或'-'.
差不多就这些了