2017-11-01 6 views
1

すべての要素を間に入れる正しい方法は、xpath->evaluateによって返されますか?xpathを反復評価する戻り値

私はその構造:

<? 
$html = ' 
<div class="xGh" style="background-image: url(\'name_file0.jpg\');"></div> 
<div class="xGh" style="background-image: url(\'name_file1.jpg\');"></div> 
<div class="xGh" style="background-image: url(\'name_file2.jpg\');"></div> 
<div class="xGh" style="background-image: url(\'name_file3.jpg\');"></div> 
'; 

libxml_use_internal_errors(true); 
$dom = new domDocument('1.0', 'utf-8'); 
$dom->loadHTML($html); 
$dom->preserveWhiteSpace = false; 
$xpath = new DOMXPath($dom); 

$items = $xpath->query('//div[@class="xGh"]'); 
for($i = 0; $i < $items->length; $i++) 
{ $ci = $xpath->evaluate("substring-before(substring-after(//*[@class=\"xGh\"]/@style, \"background-image: url('\"), \"')\")"); 
echo $ci; 
}//name_file0.jpgname_file0.jpgname_file0.jpgname_file0.jpg 

必要な出力は次のとおりです:

私のオブジェクトを反復することはできませんが、正しい結果でそのループで

<? 
$html = ' 
<div class="xGh" style="background-image: url(\'name_file0.jpg\');"></div> 
<div class="xGh" style="background-image: url(\'name_file1.jpg\');"></div> 
<div class="xGh" style="background-image: url(\'name_file2.jpg\');"></div> 
<div class="xGh" style="background-image: url(\'name_file3.jpg\');"></div> 
'; 

libxml_use_internal_errors(true); 
$dom = new domDocument('1.0', 'utf-8'); 
$dom->loadHTML($html); 
$dom->preserveWhiteSpace = false; 
$xpath = new DOMXPath($dom); 

$img = $xpath->evaluate('substring-before(substring-after(//div[@class=\'xGh\']/@style, "background-image: url(\'"), "\')")');  

echo $img;//name_file0.jpg 

編集

name_file0.jpgname_file1.jpgname_file2.jpgname_file3.jpg 

シーケンスファイルを同じにしないために、ループ内に1つのカウントイテレータを配置する正しい場所はどこですか?

他の人を返すのはどのくらい反復ですか?

+0

クエリメソッドでDOMXpathを試しましたか? '$ elements = $ xpath-> query(" ... ");' – DanielO

+0

atentionに問題があります。問題はループのあるalll file_namesを返すことになりますが、 'xpath'では新しいですが、' $ img = $ (\ 'div [@class = \' xGh \ ']/@スタイル、背景画像:url(\' ")、" \ ') ") ); '私はDOMXpathを使っています.... sry my english – MagicHat

+0

@DanielO。私のポイント、tksを明確にするための詳細を編集する – MagicHat

答えて

1

だが、これを試してみましょう:

<?php 

$html = ' 
<div class="xGh" style="background-image: url(\'name_file0.jpg\');"></div> 
<div class="xGh" style="background-image: url(\'name_file1.jpg\');"></div> 
<div class="xGh" style="background-image: url(\'name_file2.jpg\');"></div> 
<div class="xGh" style="background-image: url(\'name_file3.jpg\');"></div> 
'; 

libxml_use_internal_errors(true); 
$dom = new DOMDocument('1.0', 'utf-8'); 
$dom->loadHTML($html); 
$dom->preserveWhiteSpace = false; 
$xpath = new DOMXPath($dom); 

$divs = $xpath->query('//div[@class=\'xGh\']/@style'); 

/* @var DOMAttr $div */ 
foreach ($divs as $div) { 
    preg_match("/url\('(.*)'\)/", $div->nodeValue, $matches); 

    if (!isset($matches[1])) { 
     continue; 
    } 
    $url = $matches[1]; 

    // name_file0.jpg, ... 
    echo $url . "\n"; 
} 
+0

非常に良い男、助けのためのtks ... – MagicHat

0

substring-after()substring-before()は、XPath文字列関数です。最初の引数がロケーションパスである場合、ノードリストの結果を文字列にキャストします。つまり、リスト内の最初のノードのテキストコンテンツを返します。リストが空の場合は空の文字列を返します。

DOMXpath::evaluate()の戻り値は式によって異なります。式がロケーション・パスであれば、ノード・リストになります。文字列関数または演算子を使用する場合、スカラーかもしれません。しかし、これらの種類の表現はDOMXpath::query()ではサポートされていません。

通常、ノードを反復処理し、ノードをコンテキストとして使用してDOMノードのメソッド/プロパティと詳細表現を使用するには、1つのロケーションパス式が必要です。

@ daniel-oはDOMNode::$nodeValueを使用し、PHPでPCREを使用しました。これはここの簡単な解決策ですが、Xpathでも同様に動作します。

$attributes = $xpath->evaluate('//div[@class=\'xGh\']/@style'); 
/* @var DOMAttr $style */ 
foreach ($attributes as $style) { 
    $url = $xpath->evaluate(
    'substring-before(substring-after(., "background-image: url(\'"), "\')")', 
    $style 
); 
    var_dump($url); 
} 
関連する問題