<?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
发布于 2010-11-20 22:13:22
虽然您可以使用简单的计数器轻松地解析这样的输入,但也可以使用递归正则表达式来获得您想要的内容。一个简单的(?)验证输入的正则表达式为:
^({php\s*(\d+|(?1)+)\s*php}\s*)$
(?1)
是一个递归匹配,它尝试再次匹配第一个组,即另一个{php ... php}
令牌。我们在php
之间也有一个捕获组来捕获它们的内容。
在您的例子中,您希望捕获重叠的结果(实际上,甚至包含在其他结果中的结果)。这甚至不是很好,但仍然有可能,使用前瞻。Look-around可以有捕获组,因此模式为:
(?=({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
现在,强制性的警告词。正如我前面所说的,使用一个简单的深度计数器,它的可读性和可维护性更好,除了娱乐用途之外,在这里您并不真正需要正则表达式。
发布于 2010-11-20 20:38:43
$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";
在找这样的东西吗?
https://stackoverflow.com/questions/4234220
复制相似问题