找到相应的打开/关闭括号

时间:2014-03-06 12:30:02

标签: php regex rtf tokenize

对上一个问题的跟进:PHP how to best edit an RTF File

我相信我有一个解决方案,但还需要一些帮助。我发现如果我在模板构建器中使用合并字段,我的PHP代码可以找到/替换这种模式中的字段:" {\ field}"但问题是,我需要找到整个字符串,删除所有RTF标记,并比较留下的文本。但是,第一步是找到完整的标记。这就是我被困的地方。我需要能够找到整个字符串长度,从打开" {"关闭"}",与其他可能的" {}"之间。例如:

{\field{\*\fldinst {\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid11370280  MERGEFIELD details_awardee_name }}{\fldrslt {\rtlch\fcs1 \af31507 \ltrch\fcs0 
\lang1024\langfe1024\noproof\insrsid11370280 \'abdetails_awardee_name\'bb}}}

如您所见,此示例具有多个嵌入式标记集。该字符串也将位于更多标记的页面内。有谁知道获得整个字符串长度的方法?这可以用Regex完成吗?完成后,我可以继续剥离所有标签并进行比较。

由于 杰森

1 个答案:

答案 0 :(得分:1)

您可以使用选项PCRE_EXTENDEDx)提供的recursive pattern。这是一个例子:

$str = 'test { enclosed { sub   }} end';
$p = '~\{ ( (?>[^{}]+) | (?R) )* \}~x';

preg_match_all($p, $str, $m);
var_dump($m);

输出:

array(2) {
  [0] =>
  array(1) {
    [0] =>
    string(21) "{ enclosed { sub   }}"
  }
  [1] =>
  array(1) {
    [0] =>
    string(9) "{ sub   }"
  }
}