这是我的代码:
<?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
所以基本上,它不是捕获第一个匹配,而是捕获整个句子(这在技术上是一个更大的匹配)。如何更改模式以实际捕获第一个较小的匹配以获得所需的结果?
感谢。
答案 0 :(得分:4)
您必须使用.*
跟?
进行non-greedy匹配。
$pattern = "/{(.*?)\|(.*?)}/";
将输出以下内容。
{To|Preposition}
To
Preposition
参见 Working demo
答案 1 :(得分:2)
您需要对所有子组使用不匹配的匹配。
"/{(.*)\|(.*)}/U";
这将使模式匹配可能仍然满足模式的最少字符数。你得到了你得到的结果,因为模式/{(.*)\|(.*)}/
从开始大括号一直到结束大纲。
答案 2 :(得分:0)
将(.*)
更改为([^|]*)
,然后它将匹配除<| p>之外的所有字符