PHP RegEx捕获更大的匹配,忽略较小的匹配

时间:2014-05-20 03:54:35

标签: php regex preg-match

这是我的代码:

<?php
    $sentence = "{To|Preposition}{talk|Verb}{here|Place}.";

    $pattern = "/{(.*)\|(.*)}/";

    preg_match($pattern, $sentence, $match_arr);

    $match = $match_arr[0];

    $a = $match_arr[1];
    $b = $match_arr[2];

    echo "$match<br /><br />$a<br /><br />$b";
?>

输出结果为:

{To|Preposition}{talk|Verb}{here|Place}

To|Preposition}{talk|Verb}{here

Place

但我希望它是这样的:

{To|Preposition}

To

Preposition

所以基本上,它不是捕获第一个匹配,而是捕获整个句子(这在技术上是一个更大的匹配)。如何更改模式以实际捕获第一个较小的匹配以获得所需的结果?

感谢。

3 个答案:

答案 0 :(得分:4)

您必须使用.*?进行non-greedy匹配。

$pattern = "/{(.*?)\|(.*?)}/";

将输出以下内容。

{To|Preposition}

To

Preposition

参见 Working demo

答案 1 :(得分:2)

您需要对所有子组使用不匹配的匹配。

"/{(.*)\|(.*)}/U";

这将使模式匹配可能仍然满足模式的最少字符数。你得到了你得到的结果,因为模式/{(.*)\|(.*)}/从开始大括号一直到结束大纲。

答案 2 :(得分:0)

(.*)更改为([^|]*),然后它将匹配除<| p>之外的所有字符