Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите составить регулярку
Форумы портала PHP.SU » PHP » Регулярные выражения » Помогите составить регулярку

Страниц (1): [1]
 

1. Bio man - 25 Сентября, 2014 - 16:17:45 - перейти к сообщению
Есть таблица
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <table>
  3. <tr>
  4.   <td>123</td>
  5. </tr>
  6. <tr id="tr_detail_4613204055456460160606"> <!--рандомные данные там где куча цифр-->
  7.   <td>123</td>
  8. </tr>
  9. </table>
  10.  

как мне достать все данные из td кроме тех, где у tr есть id.
2. Panoptik - 25 Сентября, 2014 - 17:12:19 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $str = <<<HTML
  2. <table>
  3. <tr>
  4.   <td>123</td>
  5. </tr>
  6. <tr id="tr_detail_4613204055456460160606"> <!--рандомные данные там где куча цифр-->
  7.   <td>123</td>
  8. </tr>
  9. </table>
  10. HTML;
  11.  
  12.  
  13. $dom = new DomDocument();
  14. $dom->loadHTML($formData);
  15.  
  16. $trs = $dom->getElementsByTagName('tr');
  17.  
  18. // перебираем все строки
  19. for($i = 0; $i < $trs->length; $i++) {
  20.   $tr = $trs->item($i);
  21.   // пропускаем строки у которых есть айди
  22.   if(($id = $tr->attributes->getNamedItem('id')) && $id->nodeValue) continue;
  23.  
  24.   $tds = $tr->childNodes;
  25.  
  26.   // если знаете точную структуру то можно доставить ячейки по индексу начиная с 0;
  27.   // $td = $tds->item(0);
  28.  
  29.   // если нужно перебрать все, то по указанному сценарию с тр делаете тоже самое
  30.   for($j = 0; $j < $tds->length; $j++) {
  31.      $td = $tds->item($j);
  32.      
  33.      // текст ячейки
  34.      echo $td->nodeValue;
  35.   }
  36. }
  37.  


как-то так
3. Bio man - 25 Сентября, 2014 - 17:14:27 - перейти к сообщению
Спасибо конечно за альтернативу, но регуляркой будет быстрее. И памяти меньше скушает.
4. Panoptik - 25 Сентября, 2014 - 17:20:40 - перейти к сообщению
ну раз так то
PHP:
скопировать код в буфер обмена
  1. $str = <<<HTML
  2. <table>
  3. <tr>
  4.   <td>123</td>
  5. </tr>
  6. <tr id="tr_detail_4613204055456460160606"> <!--рандомные данные там где куча цифр-->
  7.   <td>123</td>
  8. </tr>
  9. </table>
  10. HTML;
  11.  
  12. if(preg_match_all('!<tr>([\s\W\w]+)</tr>!U', $str, $matchesTrs)) {
  13.     foreach($matchesTrs[1] as $trContent) {
  14.         preg_match_all('!<td>([\s\W\w]+)</td>!U', $trContent, $matches);
  15.         var_dump($matches[1]
  16.     }
  17. }
  18.  
5. Bio man - 25 Сентября, 2014 - 17:31:15 - перейти к сообщению
Забыл, что tr без id'шек. то есть там может быть класс, другой атрибут, но только не ID
6. teddy - 25 Сентября, 2014 - 18:59:15 - перейти к сообщению
Вообще парсинг DOM-а как бы должен происходить с помощью соответствующих средств.

Вариант без регулярки через xPath:
PHP:
скопировать код в буфер обмена
  1. $dom = new DOMDocument();
  2. $dom->loadHTML($html);//or loadHTMLFile
  3. $xPath = new DOMXPath($dom);
  4. $nodeList = $xPath->query('//tr[not(@id)]/td');
  5.  
  6. //собственно вывод
  7. foreach($nodeList as $DOMElement){
  8.     echo $DOMElement->nodeValue;
  9. }

Не факт что регулярка будет быстрее а если и будет то на n спичкосекунд

П.С: попробовал регуляркой, после второй провальной попытки перестал пробовать... )
Может такой вариант пригодится
7. Мелкий - 25 Сентября, 2014 - 19:04:15 - перейти к сообщению
Всецело поддерживаю мысль, что HTML регулярками парсить некорректно.

teddy пишет:
for($i = 0; $i < $nodeList->length; $i++){

Ммм, nodeList же реализует Traversable, зачем это?
8. teddy - 25 Сентября, 2014 - 19:20:22 - перейти к сообщению
Мелкий пишет:
зачем это?

Согласен. Через форыч будет проще. Обновил пост
9. Bio man - 25 Сентября, 2014 - 19:33:56 - перейти к сообщению
Спасибо. Попутный вопрос.
Как быстро исправить html?
Типо HTMLPurifier, но он подтормаживает, а без него выкидывает ошибки
Спойлер (Отобразить)
10. teddy - 25 Сентября, 2014 - 19:53:24 - перейти к сообщению
По сути в данном случае нам должно быть по барабану что PHP считает документ не валидным. Исправлять документ а потом снова его скармливать domdocument-у не самая лучшая идея.

Можно просто вырубить ошибки которые генерит libxml(остальные ворнинги при необходимости будут сгенерированы)

PHP:
скопировать код в буфер обмена
  1. $dom = new DOMDocument();
  2. $dom->loadHTML($str);
  3. $xPath = new DOMXPath($dom);
  4. $nodeList = $xPath->query('//tr[not(@id)]/td');

 

Powered by ExBB FM 1.0 RC1