如何在Preg_match_all中使用不同的正则表达式模式

时间:2014-06-25 08:30:00

标签: php regex preg-match-all

我有这条线;

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

但我想在同一个preg_match_all

中匹配这个模式
\S+[\.]?\s?\S*

我如何在PHP中实现它

2 个答案:

答案 0 :(得分:4)

  • 你的模式可能效果不好(它们看起来像拼凑在一起)
  • 话虽如此,在正则表达式中说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*
  4. <强>最后

    因此,你最终会得到类似的东西:

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

    如果你确实希望这个也能够匹配空字符串,就像((\w+)?)那样,那么整个事情都是可选的:

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

答案 1 :(得分:0)

使用逻辑OR(|)运算符

组合下面的正则表达式
$regex = "~/(?:((\w+)?)|\S+[\.]?\s?\S*)/~"

(?:)代表一个非捕获组。

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