首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Regexp中查找开始和结束标记

在Regexp中查找开始和结束标记
EN

Stack Overflow用户
提问于 2010-05-17 10:38:09
回答 2查看 1.3K关注 0票数 0

有没有一种方法可以在regexp中找到自定义标记,即匹配

代码语言:javascript
运行
复制
{a}sometext{/a}  

以及

代码语言:javascript
运行
复制
{c=#fff}sometext{/c}  

这样它就能找到整个内部内容块?问题是sometext可能有另一个标记,如下所示:

代码语言:javascript
运行
复制
{a=http://www.google.com}{b}Hello, world{/b}{/a}  

我能想出的唯一解决方案将匹配{a...到.../b}当我想{a...要.../a}是否有一个单一的regexp解决方案,或者最好匹配开始,然后使用另一种方法从备份中找到结尾,并以这种方式获取它?我使用的是PHP5.2,所以我有必要的所有选项。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-17 10:56:33

听起来你正在尝试做MediaWiki已经用wiki标记语言做过的事情。我建议使用他们的解析器和标记,或者如果您选择使用自己的解析器和标记,您可能会从他们如何做到这一点上找到灵感。

Manual for Parser.php

Source for Parser.php

票数 1
EN

Stack Overflow用户

发布于 2010-05-17 10:51:00

这是可行的:

代码语言:javascript
运行
复制
$subject = 'bla bla{a=http://www.google.com}{b}Hello, world{/b}{/a} bla';
$regex = '~\\{a(?:=[^}]+)?\\}(.*?)\\{/a\\}~';
preg_match($regex, $subject, $matches);
var_dump($matches);

提供:

代码语言:javascript
运行
复制
array(2) {
  [0]=>
  string(48) "{a=http://www.google.com}{b}Hello, world{/b}{/a}"
  [1]=>
  string(19) "{b}Hello, world{/b}"
}

开始编辑您可以使用反向引用使正则表达式更通用

代码语言:javascript
运行
复制
$regex = '~\\{([a-z]+)(?:=[^}]+)?\\}(.*?)\\{/\\1\\}~';

但在这种情况下,我不知道如何匹配任意深度的内部标记。结束编辑

但是,我强烈建议不要使用正则表达式来实现此目的。我建议你遍历字符串,一次一个数组,并使用一个辅助堆栈来跟踪你找到的标签(使用array_pusharray_popend来查看)。

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

https://stackoverflow.com/questions/2846372

复制
相关文章

相似问题

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