Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Подскажите по регулярке.
цитата
08/05/14 в 12:07
 Lexikon
preg_match_all('|<a href="(.*.jpg)"><img src="(.*.jpg)" [A-Za-z="0-9\s]+><\/a>|iU', $resultPage, $arrResult);
Хотел с галереи спарсить тумбы и изображения, всё бы хорошо, но выдерается вот так:
<a href="00.jpg"><img src="th_00.jpg" width="160" height="106" border="0" alt="text"></a></td><td width=174><a href="00.jpg"><img src="th_00.jpg" width="160" height="106" border="0" alt="text"></a></td><td width=174><a href="00.jpg"><img src="th_00.jpg" width="160" height="106" border="0" alt="text"></a>

т.е. берет вместе с такими кусками </td><td width=174>
не могу понять, где ошибка icon_confused.gif

Спасибо!
цитата
08/05/14 в 12:44
 shlemkin
preg_match_all('~<a href="(.+\.jpg)"><img src="(.+\.jpg)"[^>]+></a>~iU', $resultPage, $arrResult);
расскажешь потом, работает или нет icon_smile.gif
цитата
08/05/14 в 14:13
 Lexikon
всё тоже самое как и у меня icon_smile.gif
цитата
08/05/14 в 14:52
 Alexandur
Потсаны рекомендуют дом.


$src = 'Код: [свернуть]
<a href="00.jpg"><img src="th_00.jpg" width="160" height="106" border="0" alt="text"></a></td><td width=174><a href="00.jpg"><img src="th_00.jpg" width="160" height="106" border="0" alt="text"></a></td><td width=174><a href="00.jpg"><img src="th_00.jpg" width="160" height="106" border="0" alt="text"></a>';

$dom = new DomDocument();
   $dom->loadHTML($src);

   $xpath = new DomXPath($dom);

   $path = $xpath->query("//a/img");

   foreach($path as $href)
   {
      echo $href->parentNode->getAttribute('href')."<br />";
      echo $href->getAttribute('src') ."<br />";
   }
цитата
08/05/14 в 15:33
 freeek
Если не критично по производительности, то пользуюсь такой штукой Ganon

Код:
preg_match_all('%<a href="(.+\.jpg)"[^>]*><img src="(.+\.jpg)"[^>]*><\/a>%isU', $resultPage, $arrResult);


не панацея, сорс может быть немного другим и правило не сработает

не забываем про жадность квалификаторов
цитата
09/05/14 в 03:48
 Mika
Lexikon писал:
не могу понять, где ошибка icon_confused.gif

Знак вопроса "?" после звездочки ставь.
Почитай Mastering Regular Expressions. "Лучше день потерять, потом за 5 минут долететь." (с)

P.S. И html лучше xpath'ом парсить.

Update: не заметил сразу в коде модификатор U, так что по идее должно работать как раз без "?", ибо он инвертирует "жадность".

Последний раз редактировалось: Mika (09/05/14 в 04:04), всего редактировалось 2 раз(а)
цитата
09/05/14 в 03:49
 Mika
freeek писал:
жадность квалификаторов

И кого они квалифицируют? icon_smile.gif
цитата
09/05/14 в 12:28
 freeek
Mika писал:
И кого они квалифицируют? icon_smile.gif


Цитата:
Квалификаторы говорят о том, сколько раз последовательность символов может встретиться в строке и указываются непосредственно после той части выражения, к которой они применяются


по умолчанию они жадные, захватят всё, что собственно и произошло

Код:
$testString = 'aaaaaaa.jpg aaaaa.jpg';

preg_match('%.+\.jpg%', $testString, $match);

echo '<pre>', print_r($match, true), '</pre>';

preg_match('%.+\.jpg%U', $testString, $match);

echo '<pre>', print_r($match, true), '</pre>';

preg_match('%.+?\.jpg%', $testString, $match);

echo '<pre>', print_r($match, true), '</pre>';
цитата
09/05/14 в 14:42
 Mika
freeek писал:
Квалификаторы говорят о том, сколько раз последовательность символов может встретиться в строке и указываются непосредственно после той части выражения, к которой они применяются

facepalm.gif
Ты б хоть ссылку давал, где такое пишут.
Вот они трудности перевода. Каким образом quantifier можно перевести как квалификатор? А quantification как "спецы" переводят - квалификация?
цитата
09/05/14 в 15:19
 freeek
Mika писал:
facepalm.gif
Ты б хоть ссылку давал, где такое пишут.
Вот они трудности перевода. Каким образом quantifier можно перевести как квалификатор? А quantification как "спецы" переводят - квалификация?


smail101.gif все верно, сам оговорился и оговорку привел в цитате, конечно квантификатор, мы же кол-во считаем) smail101.gif
цитата
10/05/14 в 09:00
 Lexikon
похоже самый заебенный вариант это работа с DOM/
начал ковырять мануал. Вот только не пойму
есть
$path = $xpath->query("//a/img");
используем
foreach($path as $href)
Это для прохода по массиву, НО!
Почему когда я вызываю
print_r($path);
Мне возвращает
DOMNodeList Object ( [length] => 34 )
34 это как я понял кол-во тех самых элементов

Я почему то подумал что $path - это массив и его можно отобразить через print_r()
цитата
10/05/14 в 13:33
 Alexandur
Там где стрелочки -> там объекты.

print_r(get_object_vars($path))
цитата
10/05/14 в 17:35
 Mika
Lexikon писал:
начал ковырять мануал.
Я почему то подумал что $path - это массив и его можно отобразить через print_r()

Мануал лучше не ковырять, а читать и понимать icon_smile.gif
http://www.php.net/manual/ru/domxpath.query.php
Цитата:
Возвращаемые значения
Возвращает объект DOMNodeList содержащий узлы, отвечающие условиям отбора в XPath expression. Любой запрос, не возвращающий узлов, вернет пустой объект DOMNodeList.
цитата
26/05/14 в 17:02
 Defolt
freeek писал:
Если не критично по производительности, то пользуюсь такой штукой Ganon

Такой парсер использую, удобно. PHP Simple HTML DOM Parser
цитата
27/05/14 в 09:07
 AWD
прикол в том, что у меня код ТС работает. "U" - усмиряет жадность. мне вообще не понятно, что за х...


Эта страница в полной версии