【问题标题】:Can you explain/simplify this regular expression (PCRE) in PHP?你能解释/简化PHP中的这个正则表达式(PCRE)吗?
【发布时间】:2013-05-17 14:15:23
【问题描述】:
preg_match('/.*MyString[ (\/]*([a-z0-9\.\-]*)/i', $contents, $matches);

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

你能告诉我它逐块的作用吗(这样我可以学习)?

语法可以简化吗(我认为不需要用斜杠转义点)?

【问题讨论】:

标签: php regex pcre


【解决方案1】:

正则表达式...

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

.* 匹配任意字符零次或多次

MyString 匹配该字符串。但是您正在使用不区分大小写的匹配,因此匹配的字符串将拼写“mystring”,但可以使用任何大写

编辑:(感谢 Alan Moore)[ (\/]*。这匹配任何字符 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]中匹配并给出相同的答案

希望这会有所帮助....

【讨论】:

  • [ (\/] 完全有效。正斜杠不是正则表达式元字符,通常不需要转义。但这次必须将其转义,因为他将其用作正则表达式分隔符。
  • @Jimbo @Alan Moore 点和破折号真的需要在[a-z0-9\.\-]* 中转义吗?
  • @Avexv:连字符必须被转义,否则它将定义一个范围(除非在这种情况下正好结束)。我想你对这个点也可能是对的!刚刚测试...如果点没有被转义并且与 php.net 的引用一致,则可以工作...好点
【解决方案2】:

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

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

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

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

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

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

然后按字面意思匹配“MyString”,后跟以下任意数字(注意“*”):“”、“(”、“/”。这可能是错误区域,您需要将其转义'('。试试[(/]。

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

然后我们得到以下任意数量的捕获组:a-z 字面量、0-9 位数字、'.' 或 '-'。

差不多就这些了。

【讨论】:

    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多