2012-01-02 1 views
0

やあ、関連するテキストを置き換えるためにpreg_replaceで使用する正規表現は何ですか?

私は例として、以下のものを使用して、いくつかのテキストを置換する方法を把握しようとしている:

Lorem ipsum dolor sit amet, [annotate ref="C1849"]consectetur 
adipisicing elit[/annotate], sed do eiusmod tempor incididunt 
ut labore et [annotate ref="C9437"]dolore[/annotate] magna 
[fred ref="38"]aliqua[/fred]. 

テキストは内[]に依存して、交換します開かれた直後の値[。この場合、目的は注釈「タグ」を置き換えることです。新しいテキストは、htmlタグ(おそらくスパンまたは同様のもの)であり、いくつかのhtml属性(クラス、idなど)を挿入します。

[注釈と[/注釈]をstr_replace()で置き換えることができます。私はstr_replace()を使ってすべての ""を置き換えることができますが、 "[]のみ]が[注釈]に関連付けられているため、preg_replace()で正規表現がより適切な"の代わりに"。私はlookbehindが固定長の文字列を扱うことに気付くまで、lookbehindで遊んだ。

ご意見をお寄せください。

+1

改行や改行を許可する必要がありますか? – stackuser10210

+0

[と]の間に改行や改行はありません。 – Metalskin

答えて

1

一般に、regexを使ってxmlのようなデータ(タグ/終了タグ/属性)を解析するのは悪い考えです。DOMパーサーのようなものがはるかに優れています。

しかし、あなたの問題への迅速かつ汚い修正のために、試してみてください。

$text = 'Lorem ipsum .....'; 
$patterns = array('/\[annotate([^\]]*)\]/', 
        '/\[\/annotate\]/'); 
$replacements = array('<span blahablah \1>', 
         '</span>'); 
echo preg_replace($patterns, $replace, $text); 

$patternsは、開始タグと終了タグであること、後者は最初の要素を持っています。 開始タグはannotateの後ろのすべてをキャプチャして対応する終了]とし、replacementsを使用して\1を保持します。私は正規表現は、タグの解析のための最高のアイデアではないと言う

一つの理由は、annotateは、正規表現を台無しよ浮遊]が含まれている場合ということです。

など。 [annotate extraattribute="alblasd]"]は、最初の]ではなく、2番目の部分で切り取られます。

+0

@ Metalskin:[と]に基づいて独自のDOMを構築する場合は、[はい]を選択します。しかし、通常、DOM ParserはHTML DOM Documentを参照しています。私は数学的なコーヒーはあなたのテキストが実際にHTMLであるならば、正規表現はそれに対処するのに問題があると指摘したいと思います。 – hakre

+0

@ mathematical.coffee。ありがとう、これは私のために働く必要があります。ユーザが入力したものではなく、システムが生成した属性の値を制御することができます。 :編集:以前のコメントを削除しました。DOMの使用について質問しましたが、再投稿できると思っていましたが、hakreは返信を投稿しました。 – Metalskin

+0

@hakre明らかにしてくれてありがとう、もし私ができるならむしろDOMパーサを使うだろうが、既存のパーサを拡張せずに[と]用法を使えるとは思っていなかった。 – Metalskin

関連する問題