2014-03-06 53 views
0

一個跟進先前的問題:PHP how to best edit an RTF File查找coresponding打開/關閉支架

我相信我有一個解決方案,但需要一些更多的幫助。我發現如果我在模板構建器中使用合併域,我的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

可以使用recursive pattern可用選項PCRE_EXTENDEDx)。這裏談到一個例子:

$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 }" 
    } 
} 
+0

+1我相信'x'是不匹配多餘的空格添加了可讀性。 – anubhava

+0

你好,謝謝你的回覆。我對正則表達式不太滿意,但其中一個約束條件是搜索以'{\ field'開頭,並找到匹配的右括號,其間包含所有內容。你的例子能適應那個嗎? – jason

+0

另外,如果我有一個字符串:$ str ='test {enclosed {sub {test 3} {test 4}}} end';你的模式只發現兩套,不是所有的 – jason