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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите составить регулярку

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Bio man
Отправлено: 25 Сентября, 2014 - 16:17:45
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Есть таблица
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.
 
 Top
Panoptik
Отправлено: 25 Сентября, 2014 - 17:12:19
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




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.  


как-то так

(Отредактировано автором: 25 Сентября, 2014 - 17:13:53)



-----
Just do it
 
 Top
Bio man
Отправлено: 25 Сентября, 2014 - 17:14:27
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Спасибо конечно за альтернативу, но регуляркой будет быстрее. И памяти меньше скушает.
 
 Top
Panoptik
Отправлено: 25 Сентября, 2014 - 17:20:40
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




ну раз так то
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.  

(Отредактировано автором: 25 Сентября, 2014 - 17:21:41)



-----
Just do it
 
 Top
Bio man
Отправлено: 25 Сентября, 2014 - 17:31:15
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Забыл, что tr без id'шек. то есть там может быть класс, другой атрибут, но только не ID

(Отредактировано автором: 25 Сентября, 2014 - 17:46:02)

 
 Top
teddy
Отправлено: 25 Сентября, 2014 - 18:59:15
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Вообще парсинг 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 спичкосекунд

П.С: попробовал регуляркой, после второй провальной попытки перестал пробовать... )
Может такой вариант пригодится

(Отредактировано автором: 25 Сентября, 2014 - 19:20:16)

 
 Top
Мелкий Супермодератор
Отправлено: 25 Сентября, 2014 - 19:04:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Всецело поддерживаю мысль, что HTML регулярками парсить некорректно.

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

Ммм, nodeList же реализует Traversable, зачем это?


-----
PostgreSQL DBA
 
 Top
teddy
Отправлено: 25 Сентября, 2014 - 19:20:22
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




Мелкий пишет:
зачем это?

Согласен. Через форыч будет проще. Обновил пост
 
 Top
Bio man
Отправлено: 25 Сентября, 2014 - 19:33:56
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Спасибо. Попутный вопрос.
Как быстро исправить html?
Типо HTMLPurifier, но он подтормаживает, а без него выкидывает ошибки
Спойлер (Отобразить)
 
 Top
teddy
Отправлено: 25 Сентября, 2014 - 19:53:24
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




По сути в данном случае нам должно быть по барабану что 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');

(Отредактировано автором: 25 Сентября, 2014 - 19:54:16)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB