2013-02-03 56 views
3

HTML如何获取这些值使用XPath

<table id='dg' border='0' class="Table"> 
    <tr> 
    <td class='text'>id.</td> 
    <td class='text'>file</td> 
    <td class='text'>alt</td> 
    </tr> 
    <tr> 
    <td class='text'><input name='somename[]' type='hidden' value='1234'> 
     1</td> 
    <td class='text'><a href='#' onClick="javascript:openPopWindow('../../somefile.jpg');" ><img src='cms_thumb.php?imgsrc=somefile2.jpg' border='0' ></a></td> 
    <td class='text'><input type='text' name='title[]' value='Value 1'></td> 
    </tr> 
    <tr> 
    <td class='text'><input name='somename[]2' type='hidden' value='2345'> 
     2</td> 
    <td class='text'><a href='#' onClick="javascript:openPopWindow('../../somefile2.jpg');" ><img src='thumb.php?imgsrc=somefile2.jpg' border='0' ></a></td> 
    <td class='text'><input type='text' name='title[]' value='Value 2'></td> 
    </tr> 
</table> 

目的

需要得到IMG SRC文件名,并取得具有名称=标题[]

输入字段的值

我该怎么办?

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXpath($dom); 

foreach ($dom->getElementsByTagName('tr') as $node) { 
    $img = $xpath->query('//img')->item(0); 
    $img = str_replace("\'","",$img->getAttribute('src')); 
    $img = str_replace("cms_thumb.php?imgsrc=","",$img); 
    echo $img.'<br>'; 
} 

$ IMG只包含第一图像,而不是其他

+0

+1 - 写得很好的问题:) –

+2

'$ xpath-> query('// img') - > item(0)' - 好吧,你是_explicitly_只能得到第一个图像(索引为0的项目在匹配元素的列表中) – lanzz

+2

而你的'$ xpath'基于整个Dom,不仅是第一个'td'节点。 – j0k

回答

0

尝试:

$html = <<<HTML 
<table id='dg' border='0' class="Table"> 
    <tr> 
    <td class='text'>id.</td> 
    <td class='text'>file</td> 
    <td class='text'>alt</td> 
    </tr> 
    <tr> 
    <td class='text'><input name='somename[]' type='hidden' value='1234'> 
     1</td> 
    <td class='text'><a href='#' onClick="javascript:openPopWindow('../../somefile.jpg');" ><img src='cms_thumb.php?imgsrc=somefile2.jpg' border='0' ></a></td> 
    <td class='text'><input type='text' name='title[]' value='Value 1'></td> 
    </tr> 
    <tr> 
    <td class='text'><input name='somename[]2' type='hidden' value='2345'> 
     2</td> 
    <td class='text'><a href='#' onClick="javascript:openPopWindow('../../somefile2.jpg');" ><img src='thumb.php?imgsrc=somefile2.jpg' border='0' ></a></td> 
    <td class='text'><input type='text' name='title[]' value='Value 2'></td> 
    </tr> 
</table> 
HTML; 


$doc = new DOMDocument(); 
$doc->loadHTML($html); 


foreach($doc->getElementsByTagName("td") as $td){ 
    foreach($td->getElementsByTagName("img") as $img){ 
     $arr_img[] = array(
      "img" => $img->getAttribute("src"), 
     ); 
    } 
    foreach($td->getElementsByTagName("input") as $name){ 
     if ($name->getAttribute("name")==="title[]"){ 
      $arr_value[] = array(
       "value" => $name->getAttribute("value") 
      ); 
     } 
    } 
} 

var_dump($arr_img); // In this array will be img src's 
var_dump($arr_value); // In this array will be values of input elements which name equal to title[] 

var_dump输出将被=>

array(2) { 
    [0]=> 
    array(1) { 
    ["img"]=> 
    string(34) "cms_thumb.php?imgsrc=somefile2.jpg" 
    } 
    [1]=> 
    array(1) { 
    ["img"]=> 
    string(30) "thumb.php?imgsrc=somefile2.jpg" 
    } 
} 

array(2) { 
    [0]=> 
    array(1) { 
    ["value"]=> 
    string(7) "Value 1" 
    } 
    [1]=> 
    array(1) { 
    ["value"]=> 
    string(7) "Value 2" 
    } 
} 
0

使用DOMXPath::query()具有相对查询一起上下文参数检查是否存在img和输入元素(在第一个表格行中不是这种情况):

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXpath($dom); 

foreach ($dom->getElementsByTagName('tr') as $node) { 
    $img = $xpath->query('.//img', $node)->item(0); 
    $input = $xpath->query('.//input[@name="title[]"]', $node)->item(0); 
    if ($img && $input) { 
     echo $img->getAttribute('src'), ' - '; 
     echo $input->getAttribute('value'), '<br>'; 
    } 
} 

这会在每个表格行的任何位置搜索第一个<img><input name="title[]">元素。如果表结构总是exacltly如上所示,你可以用一个更明确的XPath优化脚本:

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXpath($dom); 

$table = $dom->getElementById('dg'); 
$images = $xpath->query('tr/td/a/img', $table); 
$inputs = $xpath->query('tr/td/input[@name="title[]"]', $table); 

要获得的属性,遍历并行$images$inputs,例如用MultipleIterator

$iterator = new MultipleIterator(); 
$iterator->attachIterator(new IteratorIterator($images)); 
$iterator->attachIterator(new IteratorIterator($inputs)); 
foreach ($iterator as $items) { 
    $src = $items[0]->getAttribute('src'); 
    $value = $items[1]->getAttribute('value'); 
    echo $src, ' - ', $value, '<br>'; 
}