Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Regexp中查找打开和关闭标记_Php_Regex - Fatal编程技术网

Php 在Regexp中查找打开和关闭标记

Php 在Regexp中查找打开和关闭标记,php,regex,Php,Regex,有没有办法在regexp中找到自定义标记,即匹配 {a}sometext{/a} 以及 {c=#fff}sometext{/c} 这样它就能找到整个内部内容块?问题是sometext可能有另一个标记,如中所示: {a=http://www.google.com}{b}Hello, world{/b}{/a} 我能想出的唯一解决方案是从{a…到…/b}匹配,当我想要{a…到…/a}时,是否有一个单一的regexp解决方案,或者最好匹配开始,然后使用另一种方法从备份中找到结束,并以

有没有办法在regexp中找到自定义标记,即匹配

{a}sometext{/a}  
以及

{c=#fff}sometext{/c}  
这样它就能找到整个内部内容块?问题是sometext可能有另一个标记,如中所示:

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

这可以:

$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);
给出:

array(2) {
  [0]=>
  string(48) "{a=http://www.google.com}{b}Hello, world{/b}{/a}"
  [1]=>
  string(19) "{b}Hello, world{/b}"
}
开始编辑 您可以使用反向引用使正则表达式更加通用

$regex = '~\\{([a-z]+)(?:=[^}]+)?\\}(.*?)\\{/\\1\\}~';
但在这种情况下,我不知道如何匹配任意深度的内部标记。 结束编辑

但是,我强烈建议不要为此使用正则表达式。我建议您迭代字符串,每次迭代一个数组,并使用一个辅助堆栈跟踪您找到的标记(使用和用于peek)。

这样做:

$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);
给出:

array(2) {
  [0]=>
  string(48) "{a=http://www.google.com}{b}Hello, world{/b}{/a}"
  [1]=>
  string(19) "{b}Hello, world{/b}"
}
开始编辑 您可以使用反向引用使正则表达式更加通用

$regex = '~\\{([a-z]+)(?:=[^}]+)?\\}(.*?)\\{/\\1\\}~';
但在这种情况下,我不知道如何匹配任意深度的内部标记。 结束编辑


但是,我强烈建议不要为此使用正则表达式。我建议您迭代字符串,每次迭代一个数组,并使用一个辅助堆栈来跟踪您找到的标记(使用和用于peek)。

听起来您正在尝试做MediaWiki已经用wiki标记语言做的事情。我建议您使用他们的解析器和标记,或者如果您选择使用自己的解析器和标记,您可能会从他们的操作中获得灵感


听起来您正在尝试做MediaWiki使用wiki标记语言已经做过的事情。我建议您使用他们的解析器和标记,或者如果您选择使用自己的解析器和标记,您可能会从他们的操作中获得灵感


谢谢你的正则表达式,但我不太明白你的建议。如果它能更有效,那么我很乐意使用它。你知道关于它的任何文章吗?谷歌搜索“parser tag nested stack”或类似的内容,你会找到关于如何解析嵌套标记的文章。谢谢你的正则表达式,但我不太理解你的建议。如果它能更有效,那么我很乐意使用它。你知道关于它的任何文章吗?谷歌搜索“parser tag nested stack”或类似的内容,你会找到关于如何解析嵌套标记的文章。这正是我想要找到的,谢谢!我正在尝试推出我自己的,因为学习经验,以及因为我只想要某些功能。这正是我试图找到的,谢谢!我正试图推出自己的,为学习经验,以及因为我只想要某些功能。