首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >preg_match搜索

preg_match搜索
EN

Stack Overflow用户
提问于 2010-11-20 18:15:12
回答 2查看 653关注 0票数 1
代码语言:javascript
运行
AI代码解释
复制
<?php
$content = "
{php
    {php 1 php}
    {php 2 php}
    {php 3 php}
php}"; 

我怎样才能得到4个字符串?

首先:

代码语言:javascript
运行
AI代码解释
复制
{php 1 php}
{php 2 php}
{php 3 php}

第二:

代码语言:javascript
运行
AI代码解释
复制
1

第三:

代码语言:javascript
运行
AI代码解释
复制
2

四:

代码语言:javascript
运行
AI代码解释
复制
3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-20 22:13:22

虽然您可以使用简单的计数器轻松地解析这样的输入,但也可以使用递归正则表达式来获得您想要的内容。一个简单的(?)验证输入的正则表达式为:

代码语言:javascript
运行
AI代码解释
复制
^({php\s*(\d+|(?1)+)\s*php}\s*)$

(?1)是一个递归匹配,它尝试再次匹配第一个组,即另一个{php ... php}令牌。我们在php之间也有一个捕获组来捕获它们的内容。

在您的例子中,您希望捕获重叠的结果(实际上,甚至包含在其他结果中的结果)。这甚至不是很好,但仍然有可能,使用前瞻。Look-around可以有捕获组,因此模式为:

代码语言:javascript
运行
AI代码解释
复制
(?=({php\s*(\d+|(?1)+)\s*php}\s*))

结果有两个额外的捕获组--用于环视的空白结果,以及带有外部{php ... php}的整个令牌,但是如果您使用PREG_PATTERN_ORDER,您的预期结果将位于第三个位置([2]):

代码语言:javascript
运行
AI代码解释
复制
[2] => Array
(
    [0] => {php 1 php}
           {php 2 php}
           {php 3 php}
    [1] => 1
    [2] => 2
    [3] => 3
)

下面是一个更复杂的示例:http://ideone.com/sWWrT

现在,强制性的警告词。正如我前面所说的,使用一个简单的深度计数器,它的可读性和可维护性更好,除了娱乐用途之外,在这里您并不真正需要正则表达式。

票数 4
EN

Stack Overflow用户

发布于 2010-11-20 20:38:43

代码语言:javascript
运行
AI代码解释
复制
$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";

在找这样的东西吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4234220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档