2017-01-27 16 views
0

現在、Poeditでウェブサイト(Smarty)を翻訳しています。 .tplファイルからすべてのテキストを取得するには、正規表現を使って{t}と{/ t}の間のデータを取得しています。その一例:Regex:複数の角かっこの間で値を読み取る

{t}Password incorrect, please try again{/t} 

正規表現はPassword incorrect, please try againを読んでの.poファイルに配置します。これはすべて正常に動作しています。それはもう少し進んだときに間違っています。

ときどき{t}タグ間のテキストにはパラメータが使用されます。これは次のようになります。

{t 1=$email|escape 2=$mailbox}No $1 given, please check your $2{/t} 

これも素晴らしいです。私はこのようなパラメータ内のブラケットを使用する場合

本当の問題を開始:

{t 1={site info='name'} 2=$mailbox}visit %1 or go to your %2{/t} 

私の正規表現は、それが最初の閉鎖ブラケットを見たときに結果が2=$mailbox}visit %1 or go to your %2になります閉じます。

私の正規表現は、次のようになります。

\{t.*?\}?[}]([^\{]+)\{\/t\}|\{t\}([^\{]+)\{\/t\} 

正規表現は、Javaプログラム内で使用されています。

誰でもこの問題を解決する方法はありますか?

+1

修正は、ネストされた括弧を処理するためのパーサを書くことです。正規表現はこの種の問題をうまく処理しません。 –

答えて

0

私が見る最も簡単な解決策は、.tplファイルを正規化することです。私は解決するために同じ問題を持っていたし、それが正規でかなり良い仕事を

{[^}]*[^{]*} 

:ちょうどこの1のようなものをすべてのタグにマッチする正規表現を使用します。

正規化の方法は、次のようになります。

final String regex = "\\{[^\\}]*[^\\{]*\\}"; 

private String normalizeContent(String content) { 
    return content.replaceAll(regex, ""); 
} 
関連する問題