如何使用重叠匹配的php preg_match_all()

发布于 2025-01-17 13:05:00 字数 1614 浏览 1 评论 0原文

我正在尝试(没有成功)使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

紅太極 2025-01-24 13:05:00

我不确定构建一个更复杂的模式来获得重叠匹配对于这种情况是一个好主意(正如 重复链接来关闭此问题)。

在这里,您所要做的只是对原始模式进行一点更改并使用它两次,一次将所有量词设置为贪婪,一次将所有量词设置为非贪婪。
使用反转量词行为的 U 修饰符可以轻松完成此操作。

$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')(.*)\z/";

if (preg_match($pattern, $str, $matches1) && preg_match($pattern.'U', $str, $matches2)) {
    $result = [$matches1, $matches2];
    print_r($result);
}

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.

$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')(.*)\z/";

if (preg_match($pattern, $str, $matches1) && preg_match($pattern.'U', $str, $matches2)) {
    $result = [$matches1, $matches2];
    print_r($result);
}

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文