2

ユーザーがアップロードした RTF ドキュメントを取得し、一部の個人データ (名前、住所など) をレターにマージし、複数の人に対してこれを行うスクリプトがあります。すべての人のレコードについて、レターの内容をマージし、それを次のマージ レターの内容と結合します。

手紙をマージする必要がある人のレコードと同じ数だけ、1 つの RTF ドキュメントをそれ自体に結合しています。ただし、各マージの終了 RTF マークアップと開始 RTF マークアップを最初に削除する必要があります。そうしないと、RTF が正しくレンダリングされません。これは正規表現の仕事のように思えます。

基本的に、文字列全体を削除する正規表現が必要です。

}\n\page 何でも\par

たとえば、この正規表現は次のように一致します。

crap
}
\page{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20 September 30, 2008\par
more crap

だから私はそれを作ることができます:

crap
\page
more crap

正規表現はここで最良のアプローチですか?

更新: RTF を使用する必要があるのはなぜですか?

ユーザーが定型書簡をアップロードできるようにして、システムがそれを使用して結合された書簡を作成できるようにしたいと考えています。RTF はプレーン テキストであるため、これはコードで非常に簡単に行うことができます。RTF が仕様の惨事であることは知っていますが、他に良い代替手段を知りません。

4

2 に答える 2

2

この場合、RTF の使用には疑問があります。あなたが全体的に何をしようとしているのかは完全には明らかではないので、必ずしもより良いものを提案することはできません.

これが本当にあなたが行きたい方法である場合、この正規表現はあなたの入力を考慮して正しい出力を与えてくれました:

$output = preg_replace("/}\s?\n\\\\page.*?\\\\par\s?\n/ms", "\\page\n", $input);
于 2008-09-30T21:06:32.913 に答える
1

これについては、私はイック・イック・イックと言えます。それにもかかわらず、RTFが実際にはその形式で終わらない、またはドキュメント全体のスタイルにフォーマットを完全に台無しにする重要な情報が含まれている、または他の多くの失敗モードのいずれかであるという奇妙なエッジケースを除いて、rcarのクラッジはお​​そらく機能します。

于 2008-09-30T21:16:41.687 に答える