preg_match('/.*MyString[ (\/]*([a-z0-9\.\-]*)/i', $contents, $matches);
我需要调试这个。我很清楚它在做什么,但由于我从来都不是正则表达式方面的专家,所以我需要你的帮助。
你能告诉我它逐块做什么(这样我就可以学习)吗?
语法是否可以简化(我认为没有必要用斜杠转义点)?
正则表达式...
'/.*MyString[ (\/]*([a-z0-9\.\-]*)/i'
.*
匹配任何字符零次或多次
MyString
匹配那个字符串。但是您正在使用不区分大小写的匹配,因此匹配的字符串将拼写“mystring”,但可以使用任何大写字母
编辑:(感谢艾伦摩尔)[ (\/]*
。这匹配任何字符space
(
或/
多次重复零。正如 Alan 指出的那样,最终的逃避/
是停止将/
其视为正则表达式分隔符。
编辑:(
不需要转义, (感谢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',后跟任何数字(注意'*'):'','(','/'。这可能是错误区域,你需要转义那个'(' 。 尝试 [ (/]。
"([a-z0-9\.\-]*)"
然后我们得到一个捕获组,可以包含以下任意数量:az 字面量、0-9 位数字、'.' 或 '-'。
这几乎就是全部了。