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

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

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

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

4

2 回答 2

3

正则表达式...

'/.*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]

希望这可以帮助....

于 2013-05-17T14:26:55.740 回答
1

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

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

让我们首先去除正则表达式分隔符(最后 /i 表示它不区分大小写):

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

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

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

然后从字面上匹配'MyString',后跟任何数字(注意'*'):'','(','/'。这可能是错误区域,你需要转义那个'(' 。 尝试 [ (/]。

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

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

这几乎就是全部了。

于 2013-05-17T14:25:25.697 回答