私は次の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を使用してこれを行うにはどうすればよいですか
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);
?>
<br>
箇条書きが続くHTML構造は<ul></ul>
、ページのレイアウトを変更せずに、順序付けされていないリストに簡単に変換できます。
次に、すべてのリストアイテムのテキストを選択し、<li></li>
それらをコンマで区切ります。このjsFiddleに例を含めました。
このテキストを取得するには、次を使用できます。
var nodes = $('ul > li').map(function() {
return $(this).text();
}).toArray().join(",");
nodes
文字列はどこにありますか'first,Second,second,third'
。