我使用此代码获取左侧导航栏的元素:
function parseInit($url) {
$ch = curl_init();
$timeout = 0;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$data = parseInit("https://www.smile-dental.de/index.php");
$data = preg_replace('/<(d[ldt])( |>)/smi', '<div data-type="$1"$2', $data);
$data = preg_replace('/<\/d[ldt]>/smi', '</div>', $data);
$html = new simple_html_dom();
$html = $html->load($data);
但面对这样的问题。
例如,如果我使用这样的语法来获取元素:$html->find("div[data-type=dd].level2")
,那么我得到所有元素,数据属性 DT,DD,DL 和类名 LEVEL2 即可。如果我使用其他语法:$html->find("div.level2[data-type=dd]")
,那么我会获得数据属性 DD 的所有元素,但类名为 LEVEL1,LEVEL2和LEVEL3等。
你能解释一下我的问题是什么吗?提前谢谢!
P.S。:所有DT,DL和DD元素都使用regexp更改为具有适当数据属性的DIV元素,因为此解析器错误地计算了这些元素的数量。
答案 0 :(得分:0)
REGEXes are not made to manipulate HTML,DOM解析器......你使用的simple_html_dom可以轻松实现......
以下代码将执行您想要的操作(检查注释):
$data = parseInit("https://www.smile-dental.de/index.php");
// Create a DOM object
$html = new simple_html_dom();
$html = $html->load($data);
// Find all tags to replace
$nodes = $html->find('td, dd, dl');
// Loop through every node and make the wanted changes
foreach ($nodes as $key => $node) {
// Get the original tag's name
$originalTag = $node->tag;
// Replace it with the new tag
$node->tag = 'div';
// Set a new attribute with the original tag's name
$node->{'data-type'} = $originalTag;
}
// Clear DOM variable
$html->clear();
unset($html);
现在,对于多属性过滤,您可以使用以下任一方法:
foreach ( $html->find("div.level2") as $key => $node) {
if ( $node->{'data-type'} == 'dt' ) {
# code...
}
}
或(由h0tw1r3提供):
// array containing all the filtered nodes
$dts = array_filter($html->find('div.level2'), function($node){return $node->{'data-type'} == 'dt';});
请阅读 MANUAL 了解更多详情......