2016-08-25 2 views
0

[または!で始まるコメントを除いて、HTMLからコメントを削除するスクリプトを作成しようとしています。例えば、以下のコメントを除去しなければならない:PHPのpreg_replace()は、空白と改行に一致しません:なぜですか?

<!-- one line comment -->

<!-- multiple line comment -->

以下ないを除去しなければならない:

<!-- ! one line comment -->

<!--! one line comment -->

<!--! multiple line comment -->

<!-- ! multiple line comment -->

<!-- !multiple line comment -->

<!--[if lt IE 9]>

私は次のことを実行しようとしている:

$html = preg_replace('/<!--[\s\r\n]*[^![].*-->/Uis', '', $html);

しかし、それは(文字の最初のクラスと一致しません任意の数のスペースと新しいライン)。たとえば、<!-- !test -->はHTMLから削除されますが、<!--!test -->は削除されません。

どういうところが間違っていますか?

+0

を正規表現

+0

ありがとうございました!それは魅力として働いた。その量指定子が必要な理由について簡単に説明できますか? – ramonztro

+0

'[\ s \ r \ n] *'は、「0から無限の出現までの[スペースまたはキャリッジリターンまたは改行」と一致]を意味します。問題は正規表現がスペースを見つけなかったためにマッチしてはいけないというあなたのコメントの一部とマッチした後、スペース! '。 '+'を追加すると、これらの空白にマッチする正規表現が強制され、@WiktorStribiżewが彼の答えで説明したように、 '!'や '[' – roberto06

0

!にいくつかの文字と改行が続いているかどうかを確認する必要があります。 possessivelyのでマッチした、ゼロ個以上の空白 - リテラル<!--

  • \s*+ -

    • <!--

      は私がregex demo

      詳細を参照してください

      '~<!--\s*+(?!!\N*\n).*?-->~s' 
      

      示唆します後続の先読みチェックがこれらのみ空白

    • (?!!\N*\n)
    • と一致した後に行われたこと - !がある場合、負の先読みはマッチに失敗し、0+改行以外の文字は、 !
    • .*?後に改行が続く - 任意0をリテラル-->
    • ~s - - DOTALL修飾子、01
    • -->:最初の(パフォーマンスを向上するために[^-]*(?:-(?!->)[^-]*)*に置き換えることができ、demoNOTE)までのできるだけ少ないように+文字、は任意の文字に一致します。

    PHP demo

    $re = '~<!--\s*+(?!!\N*\n).*?-->~s'; 
    $str = "<!-- one line comment -->\n\n<!--\nmultiple line comment\n-->\n\nThe following should not be removed:\n\n<!-- ! one line comment -->\n\n<!--! one line comment -->\n\n<!--!\nmultiple line comment\n-->\n\n<!-- !\nmultiple line comment\n-->\n\n<!--\n!multiple line comment\n-->\n\n<!--[if lt IE 9]>"; 
    preg_match_all($re, $str, $matches); 
    print_r($matches); 
    
  • +0

    'preg_match():コンパイルに失敗しました:PCREは\ L、\ l、\ N、\ U、\ uをオフセット13でサポートしていません ' – ramonztro

    +0

    使用し、私のデモと比較してください。 –

    +0

    また、 ''〜<! - \ s * +(?!! * \ n)[^ - ] *(?: - (?! - )) >〜 '' –

    関連する問題