0

これにはおそらく非常に簡単な答えがありますが、私が明確にする必要がないように、できるだけ詳細に説明したいと思います。

私はすべてのコンテンツを収集しようとしています

<content><div>CONTENT</div></content>

コンテンツは後方参照()として返される必要があります$1。contentとdivの両方に異なるパラメーター(などstyle="color: white;")があります。これらのパラメータは重要ではありませんが、それでも存在します。

複雑なのは、divに子divが含まれている可能性があることです。これらは重要ではありませんが、私の現在の正規表現と矛盾します-試合を早期に停止します。

これがコードのサンプルです。このコピー/貼り付けが数回行われ、フォーマットが異なることを想像してください。

<entry> 
<title>A general title of a post</title> 
<content type="xhtml"> 
    <div xmlns="http://www.w3.org/1999/xhtml"> 
    This is a description of the title. It may <b>contain bold text</b> or <div>even divs</div>, and everything else. It is not quite important to save these tags, but they exist nonetheless.
    </div> 
</content> 
</entry>

現在、2つの正規表現コードを使用しています。1つは宣言用で、もう1つは終了タグ用です。これは機能しますが、コンテンツに対してコードを実行する必要があります。そこで、を使用preg_replace_callback()しますが、真ん中がコールバックになるように2つを接続する方法がわかりません。

宣言:

<content \w+\s*=\s*\".*?\">[\r\n\s]{0,}<div \w+\s*=\s*\".*?\">

閉鎖:

</div>[\r\n\s]{0,}</content>

これらを組み合わせて、内容をコールバックとして返す必要があります。私は絶対にすべてを返すのようなものを試しまし([\w\W]{0,})たが、この試合は終了divで停止しません。

\bFULLWORD\bそれで、私はコマンドについて知り、それを投げ\bdiv\bました...しかし、私はそれを機能させることに成功しませんでした。おそらくそれはPHPでサポートされていませんか?または私は愚かです。

私は知らない。

助けてください!

4

2 に答える 2

2

以前にも言われていましたが、今も言われていますが、残念ながらまた言われることになります。正規表現は素晴らしいツールです。文字列の操作や正規表現のパターンマッチングに最適です。

HTMLは文字列ではありません。HTMLはマークアップ言語であり、正規言語ではありません。これは正直なところ文字列ではありませんが、1つの文字列として解釈できます(したがって、技術的に正規表現を使用してHTMLを操作できる理由)。HTMLは要素ノードに基づく独自の言語であり、何かを変更する場合はそれらの要素を操作する必要があります。

コメントで指摘されているように、PHPではDOMクラスを簡単に使用できます。

あなたはかなりの数の理由でこれをしたいです:

  • 簡単です。猫がキーボードを横切って歩いているように見えるクレイジーなパターンを作成する必要はありません。
  • ドキュメント全体を操作するのではなく、特定のノードに移動する方が(再び)簡単です。
  • 安全です。誤って変更したくないものを変更することはありません。
  • それは(再び)より安全であり、ソースデータは変更される可能性があり、それを検出して説明することができます。
  • それはより安全です(再び)、あなたは優雅に失敗することができます。

どのように?

于 2011-03-18T13:38:40.253 に答える
-2

DOMパーサーを使用します。次に例を示します:http://htmlparsing.com/php.html

于 2011-03-18T18:43:11.327 に答える