如何使用重叠匹配的php preg_match_all()
我正在尝试(没有成功)使用 preg_match_all() 获得所有可能的匹配。
任何帮助将不胜感激。先感谢您。 没有相关的问题和答案明确给出做到这一点的方法。
这是一个典型的例子:
代码是:
$str = "manger des pâtes à la carbonara dans un restaurant de pâtes";
$pattern = "/(.*) (son |sa |ses |un |une |des |du |le |les |la )(.*) dans (son |sa |ses |un |une |de la |des |du |la |le |les |l')(.*)/";
if(preg_match_all($pattern, $str, $matches, PREG_SET_ORDER)) {
print_r($matches);
}
结果(正确但不完整的我想要的)是:
Array (
[0] => Array (
[0] => manger des pâtes à la carbonara dans un restaurant de pâtes
[1] => manger des pâtes à
[2] => la
[3] => carbonara
[4] => un
[5] => restaurant de pâtes
)
)
缺少的是以下匹配:
Array (
[0] => Array (
[0] => manger des pâtes à la carbonara dans un restaurant de pâtes
[1] => manger
[2] => des
[3] => pâtes à la carbonara
[4] => un
[5] => restaurant de pâtes
)
)
总的来说我想得到:
Array (
[0] => Array (
[0] => manger des pâtes à la carbonara dans un restaurant de pâtes
[1] => manger des pâtes à
[2] => la
[3] => carbonara
[4] => un
[5] => restaurant de pâtes
)
[1] => Array (
[0] => manger des pâtes à la carbonara dans un restaurant de pâtes
[1] => manger
[2] => des
[3] => pâtes à la carbonara
[4] => un
[5] => restaurant de pâtes
)
)
I am trying (with no success) to get all possible matches with preg_match_all().
Any help would be greatly apreciated. Thank you in advance.
No related questions and answers clearly give a way to do that.
Here is a typical example :
the code is :
$str = "manger des pâtes à la carbonara dans un restaurant de pâtes";
$pattern = "/(.*) (son |sa |ses |un |une |des |du |le |les |la )(.*) dans (son |sa |ses |un |une |de la |des |du |la |le |les |l')(.*)/";
if(preg_match_all($pattern, $str, $matches, PREG_SET_ORDER)) {
print_r($matches);
}
the result (correct but incomplete for what I want) is :
Array (
[0] => Array (
[0] => manger des pâtes à la carbonara dans un restaurant de pâtes
[1] => manger des pâtes à
[2] => la
[3] => carbonara
[4] => un
[5] => restaurant de pâtes
)
)
what is missing is the following match :
Array (
[0] => Array (
[0] => manger des pâtes à la carbonara dans un restaurant de pâtes
[1] => manger
[2] => des
[3] => pâtes à la carbonara
[4] => un
[5] => restaurant de pâtes
)
)
overall I would like to get :
Array (
[0] => Array (
[0] => manger des pâtes à la carbonara dans un restaurant de pâtes
[1] => manger des pâtes à
[2] => la
[3] => carbonara
[4] => un
[5] => restaurant de pâtes
)
[1] => Array (
[0] => manger des pâtes à la carbonara dans un restaurant de pâtes
[1] => manger
[2] => des
[3] => pâtes à la carbonara
[4] => un
[5] => restaurant de pâtes
)
)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不确定构建一个更复杂的模式来获得重叠匹配对于这种情况是一个好主意(正如 重复链接来关闭此问题)。
在这里,您所要做的只是对原始模式进行一点更改并使用它两次,一次将所有量词设置为贪婪,一次将所有量词设置为非贪婪。
使用反转量词行为的 U 修饰符可以轻松完成此操作。
demo
我添加了字符串断言的结尾
\z
以强制最后一个量词当处于非贪婪模式时到达字符串末尾。I'm not sure that building a more complicated pattern to get overlapping matches is a good idea for this case (as suggested by the duplicate link invoked to close this question).
Here, all you have to do is just a little change to your original pattern and to use it twice, once with all quantifiers set to greedy and once with all quantifiers set to non-greedy.
It can be done easily with the U modifier that inverts the quantifiers behavior.
demo
I added the end of the string assertion
\z
to force the last quantifier to reach the end of the string when it is in non-greedy mode.