2

郵便のワークフローがあるアプリケーションに取り組んでいます。これらの郵便は、私のアプリケーションのビジネスルールに従って生成されます。

モデルはhtmlまたはRtfであり、ユーザーが単語を使用してrtfを作成しない限り、完全に機能します。これは仕様の範囲内ではありませんが、あまり多くの作業を必要としない場合、私の階層はWordの互換性を歓迎し、お客様の生活を楽にしてくれます。

Rtfモデルには、アプリケーション値に置き換えられるタグがあります。ほとんどのRTFでは、タグは分割されないため、検索と置換は完全に機能します。少し変更を加えて単語を処理したいと思います。

データの例:[[FooBuzz]]ほとんどのrtfでは分割されていません。

2003年の言葉で:

{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 [[}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2708730 FooBuzz}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 ]]}

そして彼らの言葉(言葉2007)もFoo{garbageinside}バズを分割しました。

そのため、一般的なRTFを完全に処理し、タグが分割されている場合でもタグを検出できるようにしたいと考えています。

2つの制約があります。最初に回帰はなく、次に単純なままである必要があります。ここではパフォーマンスは問題ではありません。

私はsymfony1.4を使用しています。実際の関連する研究コードの部分:

$regExpression = '/\[\[([^\[\]]*)\]\]/';  

preg_match_all($regExpression, $sTemplate, $outKeys); 

アップデート :

私は主にこの正規表現を完成させる必要があると思います。私はいくつかの正規表現に取り組んでいますが、まだいくつかの改善が必要です:

/([\a-zA-Z0-9]+)/  

生産 :

[0] => Array
    (
        [0] => \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 [[
        [1] => \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2708730 FooBuzz
        [2] => \rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 ]]
    )

アップデート2:

正規表現にはまだいくつか問題があります。実際には、最初にタグ値とプレーンテキストが検索されます。かなりの時間で何ができるのかわからない。

正規表現を変更する必要があるので、彼女は同じ結果を取得しますが、[[]]内では、実際にはプレーンテキストでも機能します。

さらに難しいのは、必要なことによってすべてのサンプルデータ(プレーンテキストではない)をキャッチできるようにする必要があることです。

タグとすべてのゴミを置き換える正規表現を置き換えます。私はほとんど成功しました:

/{.*?\[\[.*(?<!\\)\w+\b.*\]\].*?}/

しかし、それはあまりにも貪欲です。グループ{[[}{tag}{]]}と一致させたいのですが、{plain text} {[[} {tag} {]]} {plaintext}と一致します

?を追加します 私が読んだので、それは。*を欲張りにしないでしょうが、それは機能しません。何か案は ?

この正規表現(タグ検索の名前)の何が問題になっているのかわかりません:

\[\[(\b(?<!\\)\w+\b)\]\]

私の理解によると。[[]]の中に、バックスローで始まり、その後に任意の単語文字が続く単語を見つけます。私は正しいですか?

アップデート3:

申し訳ありませんが、不明でした。

私の最初の正規表現は、[[FooBuzz]]でFooBuzzをキャッチすることを目的としています。そして、[[FooBuzz]]をキャッチするための2番目。したがって、最初の正規表現では、テキストFooBuzzのみをキャッチし、他のすべて({} \ eoeoeなど)を無視します。

次に、[[FooBuzz]]を完全に置き換える必要があります。だから私は{[[}{FooBuzz}}{]]}を捕まえる必要があります。

実際、私は{[[}{FooBuzz}}{]]}}をキャッチしています。私もここでキャッチする必要がありますを参照してください。私は捕まえています:私は捕まえないプレーンテキスト[[FooBuzz]]。

[[の部分では、これをキャッチするだけで済みます:{\ rtlch \ fcs1 \ af0 \ ltrch \ fcs0 \insrsid5517131[[}。それは彼が貪欲な試合を見つけることができないからだと思います。それで彼は貪欲なモードにいます。そして、このデータサンプルで失敗します:

{\toto toto}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 [[}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2708730 FooBuzz}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5517131 ]]}{\toto toto}
4

2 に答える 2

1

編集後、FooBuzz またはその他の検索可能なタグを見つける

(?<=\[\[).+?\b(?<!\\)(\w+)\b(?=.+?\]\])

最初のグループと一致します。

\負の後読みを使用して先行していない単語全体を検出し、前後(?<!\\)に先行する必要があることも伝えます。[[]]

ここに例を示します。正しく含まれている最初のグループを確認できますFooBar:)

RTF をよりよく理解するために、良いリンクを見つけました。この場合、手がかりがなくても、正規表現以外のアプローチも検討できると思います。

編集:

\w+最後の角括弧の直後に正確に期待されるため、最後の正規表現は間違ってい[[wordWithoutSpaces]]ます。

{最初の「update 1」正規表現は、文字列全体に正しく一致します。「最初から始めて、すべてを見つける」と言います。どれどれ:

  • {.*?\[\[{との間のすべてに一致[[
  • .*(?<!\\)\w+\bバックスラッシュが前にない[[最初の単語文字の前後のすべてに一致します (おそらくここでは、否定後読みの前とが必要です)\w\b\w
  • .*\]\].*?}/]]と最初に見つかったものの間のすべてに一致し}ます (非貪欲)

ただし、単一のパーツを一致させたい場合は、別の一致または別のグループを作成する必要があります

編集

この回答で 2 つの正規表現をマージできる正規表現は 1 つだけなので、次のようになります。

{[^{]?[[.(?<=[[).+?\b(?]].?}

Preg_match_all2 つのタブを返します。1 つは正規表現によって一致したデータを含み、2 番目はタグです。

そして、strtr 関数のおかげで、翻訳に一致したタグだけが置き換えられます。(ワークフローの 3 ラウンド)。

于 2012-10-12T10:37:34.597 に答える
0

何人かの人々が同じ問題を抱えている場合。より優れたグローバルなソリューション。言葉の RTF 表現は ... 警察に依存します。したがって、[[FooBuzz]] の単純なテキスト検索は、新ローマ時代に機能します。しかし、Arial では単語が分解されており、巧妙な正規表現が必要です。

例:

Police                Text                                RTF
 Times new roman        [[FooBuzz]]                       {\someRtfTags [[FooBuzz]]}
  Arial                 [[FooBuzz]]                         {\hich\af1\dbch\af12\loch\f1 [[Signature}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15225063 \hich\af1\dbch\af12\loch\f1 President}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid1974114\charrsid1974114 \hich\af1\dbch\af12\loch\f1 ]]}

したがって、タグには Times new Roman を使用します。

于 2012-11-13T11:16:48.870 に答える