0

PHP Simple HTML DOMを使用して、次の HTML で Web ページを解析しています。</span>それぞれの余分なタグに注意してください<li>

<li>
  <span class="name">
    <a href="">Link</a> asdasd
  </span>
  </span>
</li>
<li>
  <span class="name">
    <a href="">Link</a> asdasd2
  </span>
  </span>
</li>

私のクエリは次のとおりです。

$lis = $dom->find('li');
foreach ($lis as $li) {
  $spans = $li->find('span');
  foreach ($spans as $span) {
    echo $span->plaintext."<br>";
  }
}

私の出力は次のとおりです。

Link asdasd 
Link asdasd2
-----------
Link asdasd2 
-----------

ご覧のとおりfind('span')、最初のスパンの子として 2 つのスパンが見つかり、次に見つけることができる<li>次のスパンから値を取得し<span>ます (たとえそれが next の子であっても<li>)。末尾を削除</span>すると、問題が修正されます。

私の質問は次のとおりです。

  1. なぜこうなった?

  2. この特定のケースをどのように解決できますか? 他のすべてはうまく機能し、スクリプトに大きな変更を加える立場にはありません。必要に応じて、DOM クエリを簡単に変更できます。

開始タグと終了タグを数え</span>て、多すぎる場合は1つ削除することを考えています。それらは常に<span>s であるため、正規表現で確認するスマートな方法はありますか?

4

2 に答える 2

1
$newTxt = preg_replace('/\<\/span\>[\S]*\<\/span\>/','</span>',$txt);

メソッド 'find(x)' はオーバーロードされた関数であり、次のものと同等のものを返すことができます。

$e->getElementById(x);
$e->getElementsById(x);
$e->getElementByTagName(x); and
$e->getElementsByTagName(x);

最初の呼び出しでは、最後の呼び出しを利用します。3 番目の可能性の 2 番目の $li で。おそらくAPIに応じてどの質問をしていたのかを最適化する方法です。どちらの場合も 3 番目の呼び出しの使用を求めていたため、API にバグが見つかったと思います。

$e->getElementByTagName();
于 2013-08-05T00:37:17.450 に答える