preg_match('/.*MyString[ (\/]*([a-z0-9\.\-]*)/i', $contents, $matches);
我需要调试这个。我很清楚它在做什么,但由于我从来不是正则表达的专家,我需要你的帮助。
你能告诉我一块一块地做什么(所以我可以学习)?
语法是否可以简化(我认为没有必要用斜杠转义点)?
答案 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位数字,'。'或' - '。
这几乎就是全部。