Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式捕获较大的匹配,忽略较小的匹配_Php_Regex_Preg Match - Fatal编程技术网

PHP正则表达式捕获较大的匹配,忽略较小的匹配

PHP正则表达式捕获较大的匹配,忽略较小的匹配,php,regex,preg-match,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 "

这是我的密码:

<?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}

To

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


谢谢。

您需要对所有子组使用ungreedy匹配

“/{(.*)\\|(.*)}/U”


这将使模式匹配尽可能少的字符,以满足模式。您得到的结果是因为模式
/{(.*.\\\\.(.*)}/
从开始大括号一直匹配到结束大括号。

您需要对所有子组使用一个ungreedy匹配

“/{(.*)\\|(.*)}/U”


这将使模式匹配尽可能少的字符,以满足模式。你得到了你得到的结果,因为模式
/{(.*\\\\\\.(.*)}/
从左大括号一直匹配到右大括号。

(.*)
更改为
([^ |]*)
然后它将匹配除

之外的所有字符
然后它将匹配除

之外的所有字符。您需要按照
*
进行匹配

它将输出以下内容

{To|Preposition}

To

Preposition

请参见您需要按照
*
进行匹配

它将输出以下内容

{To|Preposition}

To

Preposition


请参见

Ungreedy将无法解决输入中包含{something | something | something}@WizKid的情况。我相信这超出了问题的范围。非常感谢:D工作得非常好!请,请不要使用
U
修饰符-它的唯一目的是混淆。当你需要一个懒散/不灵活/不情愿的量词时,只需附加一个:
,例如
*?
(如@hwnd的答案)。此外,对于这个应用程序,最好使用一个更精确的表达式:
'/\{([^{}}}]*)\\\\}([^{}]*)\}/'
,它更快、更准确,并且根本不需要点。(事实上,我很想否决这个答案——为了鼓励使用
U
),我做了一些关于U修饰符的研究。虽然我找不到任何好的文章详细说明好的实践可能是什么样的,但我确实明白您的观点,
可能比使用U修饰符更容易访问。我对你的评论投了赞成票,因为它鼓励我重新思考我的答案,思考两种解决方案之间的利弊,但我不欣赏这种敌对态度。你似乎对RegEx非常了解(我检查了你的个人资料),所以你有很多东西要分享-但请以告知和教学为目标,而不是排斥。如果输入包含{something | something | something}@WizKid,Ungreedy将无法解决这个问题,我相信这超出了问题的范围。非常感谢:D工作得很好!请,请不要使用
U
修饰符-它的唯一目的是混淆。当你需要一个懒散/不灵活/不情愿的量词时,只需附加一个:
,例如
*?
(如@hwnd的答案)。此外,对于这个应用程序,最好使用一个更精确的表达式:
'/\{([^{}}}]*)\\\\}([^{}]*)\}/'
,它更快、更准确,并且根本不需要点。(事实上,我很想否决这个答案——为了鼓励使用
U
),我做了一些关于U修饰符的研究。虽然我找不到任何好的文章详细说明好的实践可能是什么样的,但我确实明白您的观点,
可能比使用U修饰符更容易访问。我对你的评论投了赞成票,因为它鼓励我重新思考我的答案,思考两种解决方案之间的利弊,但我不欣赏这种敌对态度。你似乎对正则表达式非常了解(我检查了你的个人资料),所以你有很多东西要分享——但请以告知和教学为目标,而不是排斥。如果输入包含{something | something | something},Ungreedy将无法解决问题,因为OP的具体需要。如果输入包含{something | something | something}它将满足OP的特定需求。为什么它不起作用?它确保最后一项中没有|字符。您是对的,实际上文本
}
停止第二个捕获组,否则第二个捕获组将匹配:“介词}{talk”。但在这种情况下,最好选择
[^}]
最后一组。为什么不起作用?它确保最后一个项目中没有|字符。您是对的,实际上文本
}
停止第二个捕获组,否则第二个捕获组将匹配:“介词}{talk”。但在这种情况下,最好为最后一个组选择
[^ |}]
{To|Preposition}

To

Preposition