【问题标题】:PHP regex examplesPHP 正则表达式示例
【发布时间】:2013-04-06 23:21:38
【问题描述】:

我是一名学习 PHP 的初学者。我正在尝试使用正则表达式的各种组合。我指的是thisthis 并在this 上尝试示例。

我的疑惑:

  1. 为什么preg_match_all('((a|b)*c)', 'ababc', $arr, PREG_PATTERN_ORDER); 同时给出ababaca 作为输出。不应该只是ababac吗?

  2. 假设我正在尝试读取 $arr 中的所有可能输出,我该如何做到这一点而不必回显数组的每个元素?目前,我使用foreach 来迭代$arr 中的元素。这是正确的/有更好的方法吗?

  3. 为什么preg_match_all() 给出一个包含元素$arr[$i][0] 和在某些情况下$arr[0][$i] 的二维数组,其中$i 不是可能的匹配项。有没有办法知道输出将如何存储?

很抱歉在一篇文章中发布了太多问题。请告诉我是否需要更改。

【问题讨论】:

  • 让我们从第一个开始:你能把var_dump($arr) 放上我们看看它给出了什么吗?
  • echo var_dump($arr);给我 array(1) { [0]=> array(2) { [0]=> string(6) "ababac" [1]=> string(1) "a" } }

标签: php regex preg-match-all capture-group


【解决方案1】:
  1. (a|b) 是一个捕获的子模式,因此它作为结果数组的一部分返回。您可以使用(?:a|b) 使其不被捕获,但作为字符类[ab] 会更好。

  2. foreach 可能是最好的方法。

  3. 如 1 中所述,您将捕获子模式并将其返回到数组中。

您可能需要查看preg_replace_callback(),因为这会将给定的回调(通常是匿名函数)应用于每个匹配项。

【讨论】:

  • 对不起,我没有得到 ?: 部分。这是什么意思?我知道 ?表示 0 或一个字符。
  • @PRamesh:非捕获组。你不需要得到()里面的pattern匹配的文本,你只需要grouping属性,所以非捕获组(?:pattern)就是你想要的。
  • “I know ? 表示 0 或一个字符” 就像说“我知道 I 表示“我”,那么“in”是什么意思?”跨度>
  • @nhahtdh-好的。但是如果 (a|b) 被评估为子模式,为什么不返回 b 呢?
  • 因为重复的子模式只返回最后一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
相关资源
最近更新 更多