0

こんにちは私はテスト内のテキストを取得するためにこの正規表現を使用しています

<div id = "test">text</div>

$regex = "#\<div id=\"test\"\>(.+?)\<\/div\>#s";

しかし、シナリオが変更された場合、たとえば

<div class="testing" style="color:red" .... more attributes and id="test">text</div>

また

<div class="testing" ...some attributes... id="test".... some attributes....>text</div>

また

<div id="test" .........any number of attributes>text</div>

その場合、上記の正規表現はdivタグ間のテキストを抽出できなくなります。最初のケースでは、より多くの属性がdivタグのid属性の前に配置されている場合、つまりid属性が最後の属性である場合、上記の正規表現は機能しません。2番目の場合、id属性はいくつかの属性の間にあり、3番目の場合、それはdivタグの最初の属性です。ID ONLYを指定してdivタグ間のテキストを抽出するために、上記の3つの条件に一致する正規表現を使用できますか?正規表現のみを使用する必要があります:(。

助けてください

ありがとうございました....

4

4 に答える 4

4

HTML/XML を解析するための正規表現を記述しようとする終わりのない悲しみから身を守るために、HTML パーサーを強くお勧めします。

于 2012-08-01T13:20:08.440 に答える
1

これがDOMの答えです(ちょっと粗雑ですが機能します)

$aPieceOfHTML = '<div class="testing" id="test" style="color:red">This is my text blabla<div>';

$doc = new DOMDocument();
$doc->loadHTML($aPieceOfHTML);
$div = $doc->getElementsByTagName("div");
$mytext = $div->item(0)->nodeValue;

echo $mytext;

クトゥルフの方法は次のとおりです。

$regex = '/(?<=id\=\"test\"\>).*(?=\<\/div\>)/';

免責事項 これがすべての場合に機能することを保証するものではありません(それから遠く離れています)。実際、これは次の場合に失敗します。

  1. id="test"最後のタグ属性ではありません
  2. id="test"とクロージングの間にスペース(または何か)がある場合>
  3. divタグが適切に閉じられていない場合</div>
  4. タグが大文字で書かれている場合
  5. タグ属性が大文字で書かれている場合
  6. わかりません...これはおそらくもっと多くの場合失敗するでしょう

もっと複雑な正規表現を書こうと試みることもできますが、これよりもはるかに優れたものを思いつくことはできないと思います。さらに、HTMLをより適切に解析できるPHPで構築された他のツールがある場合、それは一種の時間の無駄のように思われます。

于 2012-08-01T13:34:22.027 に答える
1

その DOM 要素を xpath 経由で取得することをお勧めします。その要素の xpath 式は次のとおりです。

//div[@class="testing"]

これはすべて、PHP DOMDocument 拡張機能または SimpleXML 拡張機能を使用して行うことができます。どちらも、正規表現拡張と同じように、PHP で 99.9% 出荷さ​​れます。いくつかの大まかなサンプル コード ( demo ):

echo simplexml_import_dom(@DOMDocument::loadHTML($html))
         ->xpath('//div[@class="testing"]')[0];

Xpath は、XML ドキュメントから要素とデータをクエリするための特殊な言語であり、正規表現はより単純な文字列用の言語です。

編集: ID と同じ: http://codepad.viper-7.com/h1FlO0

//div[@id="test"]

これらの単純な xpath 式がどのように機能するかはすぐに理解できたと思います。

于 2012-08-01T13:31:26.333 に答える