<?php
$content = "
{php
{php 1 php}
{php 2 php}
{php 3 php}
php}";
我如何获得4个字符串?
首先:
{php 1 php}
{php 2 php}
{php 3 php}
第二
1
第三
2
四:
3
答案 0 :(得分:4)
虽然您可以使用简单的计数器轻松解析此类输入,但可以使用递归正则表达式来获得所需内容。一个简单的(?)正则表达式验证输入将是:
^({php\s*(\d+|(?1)+)\s*php}\s*)$
(?1)
是一个递归匹配,它会再次尝试匹配第一个组,这是另一个{php ... php}
标记。我们在php
之间也有一个捕获组来捕获它们的内容。
在您的情况下,您希望捕获重叠结果(事实上,甚至包含在其他结果中的结果)。这甚至不那么漂亮,但仍然可以使用前瞻。环视可以有捕获组,因此模式将是:
(?=({php\s*(\d+|(?1)+)\s*php}\s*))
结果有两个额外捕获的组 - 环顾四周的空白结果,以及外部{php ... php}
的整个标记,但如果您使用PREG_PATTERN_ORDER
,您的预期结果将位于第三个位置([2]
):
[2] => Array
(
[0] => {php 1 php}
{php 2 php}
{php 3 php}
[1] => 1
[2] => 2
[3] => 3
)
这是一个更复杂的例子:http://ideone.com/sWWrT
现在,强制要求谨慎。正如我之前所说的,通过一个简单的深度计数器,它更具可读性和可维护性,除了娱乐用途之外,你真的不需要正则表达式。
答案 1 :(得分:0)
$regex = preg_match_all("/({php (\d+) php})+/", $content);
$regex[0][0] == "{php 1 php}";
$regex[0][1] == "{php 2 php}";
$regex[0][2] == "{php 3 php}";
end($regex)[0] == "1";
end($regex)[1] == "2";
end($regex)[2] == "3";
寻找这样的东西?