【问题标题】:How To Use Different Regex Patterns In Preg_match_all [duplicate]如何在 Preg_match_all 中使用不同的正则表达式模式
【发布时间】:2014-06-25 08:30:00
【问题描述】:

请给我这条线;

preg_match_all('/((\w+)?)/'

但我也想在同一个 preg_match_all 中匹配这个模式

\S+[\.]?\s?\S*

我如何在 PHP 中实现它

【问题讨论】:

标签: php regex preg-match-all


【解决方案1】:
  • 您的模式可能效果不太好(它们看起来是拼凑在一起的)
  • 话虽如此,在正则表达式中表示OR 的方式是交替运算符|
  • 因此您可以通过$regex = "~\S+[\.]?\s?\S*|((\w+)?)~"; 加入他们

...但在我看来,这种模式需要美容工作。 :)

  1. \S+[\.]?\s?\S* 可以整理为 \S+\.?\s?\S*,但是 \S+ 会吃掉 \. 所以你可能需要一个懒惰的量词:\S+?\.?\s?\S*...但这只是一些实心字符 + 一个可选的点 +一个可选空格 + 可选实心字符...所以中间的句点可以去,因为\S 已经指定了它。我们最终得到\S+\s?\S*
  2. ((\w+)?) 只是 \w*,除非您需要捕获组。
  3. 但是\S+\s?\S*能够匹配所有\w*匹配的东西,除了空字符串,所以你可以把它减少到\S+\s?\S*

终于

因此,您最终会得到如下结果:

$regex = "~\S+\s?\S*~";
$count = preg_match_all($regex,$string,$matches);

如果您确实希望它也能够匹配空字符串,就像 ((\w+)?) 所做的那样,那么将整个事情设为可选:

$regex = "~(?:\S+\s?\S*)?~";

【讨论】:

    【解决方案2】:

    只需使用逻辑 OR(|) 运算符组合下面的正则表达式,

    $regex = "~/(?:((\w+)?)|\S+[\.]?\s?\S*)/~"
    

    (?:) 表示非捕获组。

    它将打印由第一个或第二个正则表达式匹配的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多