2016-07-24 19 views
0

複数のHTMLコメントを含むHTMLがあります。各コメント内にはフォームがあります。私はpreg_replaceを使用して、これらのコメントとフォームを[CONTACT_FORM_X]という形式のタグで囲みます.Xはフォームの数値IDです。PHP regex - 置き換えられた文字列の数値を置き換えます。

$str = 'blah blah blah <!-- CONTACT FORM START [CONTACT_FORM_1] -->some form goes here<!-- CONTACT FORM END 1 --> blah blah blah <!-- CONTACT FORM START [CONTACT_FORM_2] -->another form goes here<!-- CONTACT FORM END 2 -->'; 

$replace = preg_replace('/<!-- CONTACT FORM START \[CONTACT_FORM_\d\] -->.*<!-- CONTACT FORM END \d -->/', '[CONTACT_FORM_X]', $str); 
echo $replace; 

だから:

<!-- CONTACT FORM START [CONTACT_FORM_1] -->some form goes here<!-- CONTACT FORM END 1 --> 

<!-- CONTACT FORM START [CONTACT_FORM_2] --> another form goes here<!-- CONTACT FORM END 2 --> 

[CONTACT_FORM_2]で完全に置き換える必要があり

そして.. [CONTACT_FORM_1]で完全に置き換える必要があります私

​​

だから私の質問は次のとおりです:

  1. どのように私は、\ dの値を取得し、その後、私は現在でXを使う場所の代わりにこれを使用することができます私が手の上にF私は私のコードを実行します私のpreg_replace

  2. 私のコードは両方のフォームではなくフォームの1つを置き換えるようです。私は複数の出現をすべて置き換えます

答えて

1

preg_replaceを置き換えることを可能にするにpreg_replaceを適応させることができますどのように(それはグローバルです)。 .*は貪欲ですが、<!-- CONTACT FORM START \[CONTACT_FORM_(\d)\]の後のすべてを<!-- CONTACT FORM END \d -->にマッチングしています。値を取得するには()を使用します。

ので、試してみてください。

.*?<!-- CONTACT FORM START \[CONTACT_FORM_(\d)\] -->.*?<!-- CONTACT FORM END \d --> 

またはあなたが後方参照を使用するのと同じクロージング問い合わせフォームに一致していることを確認したい場合:

.*?<!-- CONTACT FORM START \[CONTACT_FORM_(\d)\] -->.*?<!-- CONTACT FORM END \1 --> 

大手.*?が前のコンテンツ場合は削除する必要があります維持する必要があります。それは私の意図が何であるかは不明です。 Should be replaced entirely with [CONTACT_FORM_2]から、私はそれが残るべき唯一のコンテンツだと解釈しました。

正規表現のデモ:https://regex101.com/r/kS2nK6/1

PHPの使用法:

<?php 
$str = 'blah blah blah <!-- CONTACT FORM START [CONTACT_FORM_1] -->some form goes here<!-- CONTACT FORM END 1 --> blah blah blah <!-- CONTACT FORM START [CONTACT_FORM_2] -->another form goes here<!-- CONTACT FORM END 2 -->'; 

$replace = preg_replace('/.*?<!-- CONTACT FORM START \[CONTACT_FORM_(\d)\] -->.*?<!-- CONTACT FORM END \d -->/', '[CONTACT_FORM_$1]', $str); 
echo $replace; 

PHPデモ:

$pattern = '/<!-- CONTACT FORM START \[CONTACT_FORM_(\d+)\] -->.*<!-- CONTACT FORM END \1 -->/'; 
$replace = preg_replace($pattern, '[CONTACT_FORM_$1]', $str); 

Live demohttps://eval.in/611232

1
あなたのパターンと、以下のようにあなたの置換文字列を変更し

それは括弧の中にあなたが後で再利用したい任意のテキストを入れ

  • 仕組み。これはというグループと呼ばれます。だから\d(\d+)に変更しました(+は2桁+数字のみを許可します)
  • パターン内から最初に取り込まれたグループを参照するには、\1を使用してください。 CONTACT FORM END \dからCONTACT FORM END \1に変更すると、同じ番号のENDSTARTで表示されたらすぐに置換する文字列が停止することを正規表現エンジンに伝えます。これがなければ、エンジンはすべてを最後のCONTACT FORM ENDに置き換えます。だからこそあなたはただ一つの交換品を手に入れていたのです。
  • 置換文字列では、最初に取得したグループを参照するのに$1を使用してください。そのため、CONTACT_FORM_XからCONTACT_FORM_$1に変更すると、正しい文字列が置換文字列に配置されます。
+1

@ chris85そうです。私が持っています。 '完全に置き換えられるべきである'は、「間違い」を含まない部分文字列を参照する(OPを再度チェックする) – BeetleJuice

+0

ああ、その場合は不明である。私は私の答えにもメモを追加します。 – chris85

関連する問題