Регулярное выражение

Статус
В этой теме нельзя размещать новые ответы.

sundance2001

Новичок
Регулярное выражение

Добрый день.
Столкнулся с задачкой: в HTML коде найти строки вида

<img name="item_100305" src="http://mywebsite.com/1000.10000.4000.000.jpg" border=0 alt="Description1" class="myclass">
<img name="item_444672" src="http://mywebsite.com/3400.1234.43240.044.jpg" border=0 alt="Description2" class="myclass">

и получить из каждой следующую инфо: id картинки, указанное в name и полный путь с названием (все, что в кавычках src="").


Делаю так:
PHP:
$data = file_get_contents("http://localhost/page.html");
$pattern = "~(?<=<img name=\"item_)([0-9]*)\" src=\"(http:\/\/[a-zA-Z0-9.\/]\.jpg)\" (?=border=0 alt=)~";
preg_match_all($pattern, $data, $images);

//смотрим результат
echo $images[0][0]."\n<br>".$images[1][0]."\n<br>".$images[2][0];
скрипт ничего не находит. Пожалуйста, подскажите, где у меня ошибка?

Если задать паттерн так:
PHP:
$pattern = "~<img name=\"item_([0-9]{3,})\" src=[\"']?([a-zA-Z\/]*)[\"']~";
, то скрипт возвращает лишь значения $images[0][0] и $images[1][0], а значение $images[2][0] (ссылка на файл) - пустое.

Что-то, видимо, тоже не так. :(
 

MajestiC

Пых
$pattern = "~(?<=<img name=\"item_)([0-9]*)\" src=\"(http:\/\/[a-zA-Z0-9.\/]\.jpg)\" (?=border=0 alt=)~";
Сразу первая ошибка - [a-zA-Z0-9.\/], добавь + или * например. Включи еще Ungreedy режим.

Работающая регулярка (тестил правда не в PHP, а в RegexBuddy):
~<img name="item_([0-9]*)" src="(http:\/\/[a-zA-Z0-9.\/]*\.jpg)"[^>]*~U

Сократить наверное можно до:
~name="item_([0-9]*)" src="(http:\/\/[a-zA-Z0-9.\/]*\.jpg)"~U
 

sundance2001

Новичок
Автор оригинала: MajestiC
Включи еще Ungreedy режим.

~<img name="item_([0-9]*)" src="(http:\/\/[a-zA-Z0-9.\/]*\.jpg)"[^>]*~U
огромное спасибо за ответ!

Прости, за глупый вопрос - как включить Ungreedy? Это, я так понимаю, где-то в конфигурациооном файле?

Если написать:
PHP:
$pattern = "~<img name="item_([0-9]*)" src="(http:\/\/[a-zA-Z0-9.\/]*\.jpg)"[^>]*~U";
, то приходится экранировать все двоеточия. Нужно ли экранировать слэши \ ?

пробывал с одинарными слэшами:
PHP:
$pattern = '~<img name="item_([0-9]*)" src="(http:\/\/[a-zA-Z0-9.\/]*\.jpg)"[^>]*~U';
Не работает. :confused:


а может быть сюда [a-zA-Z0-9.\/] еще что-нибудь добавить нужно? Дефис, например, и символ подчеркивания

[-,_,a-zA-Z0-9.\/] - так правильно?
 

MajestiC

Пых
Ungreedy режим это U после ~. Ты его уже включил.

<?
$data = file_get_contents("http://localhost/page.html");

$pattern = '~<img name="item_([0-9]*)" src="(http:\/\/[a-zA-Z0-9.\/]*\.jpg)"[^>]*~U';
preg_match_all($pattern, $data, $images);

//смотрим результат
print_r($images);
?>
У меня работает на твоем примере.

[-,_,a-zA-Z0-9.\/] - так правильно?
Нет, скорее [-_a-zA-Z0-9.\/]
 

sundance2001

Новичок
Заработал вариант [-_:a-zA-Z0-9.\/]

Дело было в двоеточии! там же ссылка начинается с http://!

Теперь все работает! Огромное спасибо за помощь и низкий поклон!
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху