2

まだタグ内にない文字列内のコメント タグを見つけて、<pre>それらをタグでラップしたいと考えてい<pre>ます。

PHP DOM を使用してコメントを「見つける」方法がないようです。

私はすでに正規表現を使用して処理の一部を行っていますが、正規表現の先読みと後読みには非常に慣れていません (まだ把握していないか、本当に理解していません)。

たとえば、次のコードがあるかもしれません。

<!-- Comment 1 -->

<pre>
    <div class="some_html"></div>
    <!-- Comment 2 -->
</pre>

コメント 1 をタグでラップしたいのですが<pre>、コメント 2 は既に<pre>.

これは通常、正規表現でどのように行われますか?

否定的なルックアラウンドについて私が理解していることは次のとおりです。私の試みは、明らかに非常に間違ったことをしています!

(?<!<pre>.*?)<!--.*-->(?!.*?</pre>)

4

4 に答える 4

2

このコードを再利用する予定がある場合は、DOM パーサーを使用する必要があります。すべての正規表現アプローチは、現実世界の HTML を提示すると、遅かれ早かれ恐ろしく失敗します。

そうは言っても、できることは次のとおりです(ただし、すべきではありません。上記を参照)。

まず、コメントを特定します。

<!-- (?:(?!-->).)*-->

否定先読みブロックにより、.* がコメント ブロックを使い果たしません。

<pre>ここで、このコメントがブロック内にあるかどうかを確認する必要があります。ここでの重要な観察は、まだ含まれていないすべてのコメントの後に、いずれか<pre>または要素が偶数個あるということです。</pre>

したがって、テキストの残りの部分を常に のペアで<pre>実行し、最後に到達したかどうかを確認してください。

これは次のようになります

(?=(?:(?!</?pre>).)*(?:</?pre>(?:(?!</?pre>).)*</?pre>(?:(?!</?pre>).)*)*$)

だから、一緒にこれは

<!-- (?:(?!-->).)*-->(?=(?:(?!</?pre>).)*(?:</?pre>(?:(?!</?pre>).)*</?pre>(?:(?!</?pre>).)*)*$)

書き込み専用コードの万歳 =)

この式の顕著な構成要素は、 orシーケンス(?:(?!</?pre>).)の開始ブラケットではないすべての文字に一致するものです。<pre></pre>

属性の許可<pre>と適切なエスケープは、読者の演習として残されています。RegExrで実際にこれを参照してください。

于 2013-08-16T09:51:46.663 に答える
1

PHP DOM を使用してコメントを「見つける」方法がないようです。

もちろんできます... PHP Simple HTML DOM Parserを使用してこのコードを確認してください:

<?php
$text = '<!-- Comment 1 -->

        <pre>
            <div class="some_html"></div>
            <!-- Comment 2 -->
        </pre>';

echo  "<div>Original Text: <xmp>$text</xmp></div>";

$html = str_get_html($text);

$comments = $html->find('comment');

// if find exists
if ($comments) {

  echo '<br>Find function found '. count($comments) . ' results: ';

  foreach($comments as $key=>$com){
    echo '<br>'.$key . ': ' . $com->tag . ' wich contains = <xmp>' . $com->innertext . '</xmp>';
  }
}
else
  echo "Find() fails !";
?>

$com->innertext<!-- Comment 1 -->...のようなコメントが表示されます。

必要に応じてそれらをきれいにするだけです。たとえば、<!--\s*(.*)\s*-->... ここで試してみてください

編集:

後読みに関する注意点として、固定幅でなければならないため、繰り返し*+やオプションの項目を使用することはできません?

悪いニュースは、ほとんどの正規表現フレーバーでは、正規表現を後方に適用できないため、後読み内で正規表現を使用することを許可していないことです。したがって、正規表現エンジンは、後読みをチェックする前に、何ステップ戻るかを判断できる必要があります。

したがって、Perl や Python で使用されるものを含む多くの正規表現フレーバーでは、固定長の文字列のみが許可されます。一致の長さを事前に決定できる任意の正規表現を使用できます。これは、リテラル テキストと文字クラスを使用できることを意味します。繰り返しや任意項目はご利用いただけません。代替を使用できますが、代替のすべてのオプションが同じ長さである場合に限ります。

ソース: http://www.regular-expressions.info/lookaround.html

于 2013-08-16T10:01:59.307 に答える