【问题标题】: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 中实现它
【问题讨论】:
-
alternation 有什么问题?顺便说一句,[\.]? 是 \.?,您的第一个正则表达式可以更改为 /\w*/。
-
-
标签:
php
regex
preg-match-all
【解决方案1】:
- 您的模式可能效果不太好(它们看起来是拼凑在一起的)
- 话虽如此,在正则表达式中表示
OR 的方式是交替运算符|
- 因此您可以通过
$regex = "~\S+[\.]?\s?\S*|((\w+)?)~"; 加入他们
...但在我看来,这种模式需要美容工作。 :)
-
\S+[\.]?\s?\S* 可以整理为 \S+\.?\s?\S*,但是 \S+ 会吃掉 \. 所以你可能需要一个懒惰的量词:\S+?\.?\s?\S*...但这只是一些实心字符 + 一个可选的点 +一个可选空格 + 可选实心字符...所以中间的句点可以去,因为\S 已经指定了它。我们最终得到\S+\s?\S*
-
((\w+)?) 只是 \w*,除非您需要捕获组。
- 但是
\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*)/~"
(?:) 表示非捕获组。
它将打印由第一个或第二个正则表达式匹配的字符串。