2014-08-28 1 views
0

Я использую этот код для получения элементов левой панели навигации:Проблем с несколькими атрибутами, а с помощью PHP Simple HTML DOM

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 были изменены с регулярным выражением на элементы DIV с соответствующими атрибутами данных, поскольку этот парсер неправильно подсчитывает количество этих элементов.

+0

разбор DOM _выключена_ осуществляется с помощью регулярных выражений, это делается с помощью DOM парсер ('DOMDocument' или' SimpleXMLElement'), они позволяют вам строить и управлять DOM надежно (т. Е. Заменять теги и т. Д.). –

+0

Я рассказал о дополнительных действиях (не сделанных парсером) для преобразования некоторых элементов HTML. – jekahm

+0

Да, все, что я говорю, это то, что вам действительно нужно искать альтернативные подходы: используя другой парсер, который может обрабатывать эти теги, например. Regex + Нерегулярные языки не смешиваются, это просто печальный факт жизни –

ответ

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); 

Here's is it in action

Теперь для фильтрации несколько атрибутов, вы можете использовать один из следующих методов:

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 для получения более подробной информации ...

+0

Спасибо!) Это намного проще, чем регулярное выражение. И он работает хорошо таким образом. Но, может быть, вы знаете, что теперь делать с строками запросов, которые я описал выше, и которые получают неправильный результат? Был бы очень благодарен за вашу помощь! – jekahm

+0

Большое спасибо!) Это работает для меня хорошо! – jekahm

Смежные вопросы