0

私は次のhtml構造を持っています

<span class="x">a</span>
<br>
• first
<br>
• Second
<br>
• second
<br>
• third
<br>
<br>
<span class="x">b</span>

スパンノード間、つまり1番目、2番目、2番目、3番目の間に発生するすべてのテキスト値(カンマ区切り)を取得する必要があります

xpath、domを使用してこれを行うにはどうすればよいですか

4

2 に答える 2

3

XPathを使用してこれらの要素をクエリできますが、SimpleXMLは拡張文字列編集機能なしでXPath 1.0のみをサポートするため、PHPでこれらの箇条書きの「クリーンアップ」を行う必要があります。

最も重要なのはXPath式です。これについて詳しく説明します。

  • //span[text()='a']/following::text():コンテンツ「a」のスパンののすべてのテキストノードをフェッチします
  • [. = //span[text()='b']/preceding::text()]それらのそれぞれを、コンテンツ「b」のスパンののテキストノードのセットと比較します。

そしてここに完全なコードがあります、あなたは箇条書きを取り除くことにもう少し努力を投資したいかもしれません。PHPがUTF-8として評価していることを確認してください。評価していない場合は、箇条書きの代わりに文字化けが表示されます。

<?php
  $html = '
<span class="x">a</span>
<br>
• first
<br>
• Second
<br>
• second
<br>
• third
<br>
<br>
<span class="x">b</span></wrap>
';

  libxml_use_internal_errors(true);
  $dom = new DOMDocument();
  $dom->preserveWhiteSpace = false;
  $dom->strictErrorChecking = false;
  $dom->recover = true;
  $dom->loadHTML($html);

  $xpath = new DOMXPath($dom);
  $results = $xpath->query("//span[text()='a']/following::text()[. = //span[text()='b']/preceding::text()]");

  foreach ($results as $result) {
    $token = trim(str_replace('•', '', $result->nodeValue));
    if ($token) $tokens[] = $token;
  }

  echo implode(',', $tokens);
?>
于 2013-02-09T09:09:43.207 に答える
1

<br>箇条書きが続くHTML構造は<ul></ul>、ページのレイアウトを変更せずに、順序付けされていないリストに簡単に変換できます。

次に、すべてのリストアイテムのテキストを選択し、<li></li>それらをコンマで区切ります。このjsFiddleに例を含めました。

このテキストを取得するには、次を使用できます。

var nodes = $('ul > li').map(function() {
return $(this).text();
}).toArray().join(",");

nodes文字列はどこにありますか'first,Second,second,third'

于 2013-02-09T08:03:11.547 に答える