繁体   English   中英

preg_match搜索

[英]preg_match search

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

虽然您可以使用简单的计数器轻松解析此类输入,但可以使用递归正则表达式来获取所需内容。 一个简单的(?)正则表达式来验证输入将是:

^({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

现在,强制要求谨慎。 正如我之前所说的,通过一个简单的深度计数器,它更具可读性和可维护性,除了娱乐用途之外,你真的不需要这里的正则表达式。

$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";

正在寻找这样的东西?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM