используя preg_match_all, чтобы получить имя изображения - PullRequest
1 голос
/ 28 мая 2011

После использования curl, я получил с внешней страницы, у меня есть весь исходный код с чем-то вроде этого (интересующая меня часть)

   (page...)<td valign='top' class='rdBot' align='center'><img src="/images/buy_tickets.gif" border="0" alt="T"></td> (page...)

Так что я использую preg_match_all, яхочу получить только "buy_tickets.gif"

$pattern_before = "<td valign='top' class='rdBot' align='center'>";
$pattern_after = "</td>";
$pattern = '#'.$pattern_before.'(.*?)'.$pattern_after.'#si';

preg_match_all($pattern, $buffer, $matches, PREG_SET_ORDER);

Все хорошо до сих пор ... но проблема в том, что иногда внешние страницы меняются и изображение, которое я ищу, находится внутри ссылки

(page...)<td valign='top' class='rdBot' align='center'><a href="blaa" title="ble"><img src="/images/buy_tickets.gif" border="0" alt="T"></a></td> (page...)

и я не знаю, как заставить мой код работать всегда (не только когда изображение не получает ссылки)

надеюсь, вы понимаете

заранее спасибо

Ответы [ 5 ]

5 голосов
/ 28 мая 2011

Не используйте регулярные выражения для анализа HTML , используйте PHP DOM Extension .Попробуйте это:

$doc = new DOMDocument;

@$doc->loadHTMLFile( 'http://ventas.entradasmonumental.com/eventperformances.asp?evt=18' ); // Using the @ operator to hide parse errors

$xpath  = new DOMXPath( $doc );

$img = $xpath->query( '//td[@class="BrdBot"][@align="center"][1]//img[1]')->item( 0 ); // Xpath->query returns a 'DOMNodeList', get the first item which is a 'DOMElement' (or null)

$imgSrc = $img->getAttribute( 'src' );

$imgSrcInfo = pathInfo( $imgSrc );

$imgFilename = $imgSrcInfo['basename']; // All you need
1 голос
/ 28 мая 2011

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

Бывают случаи, когда целесообразно использовать регулярные выражения для такого рода вещей, и я невсегда соглашайтесь с довольно жестким советом, данным здесь по этому вопросу (и в других местах).Однако в этом случае я бы сказал, что регулярное выражение не является для вас подходящим решением.

Проблема с использованием регулярного выражения для поиска вещей в коде HTML - это именно та проблема, с которой вы столкнулись - код HTML может отличатьсядико, делая любое регулярное выражение практически невозможно, чтобы получить право.

Почти возможно написать регулярное выражение для вашей ситуации, но это будет безумно сложное регулярное выражение, и очень хрупкое - то есть склонное к неудаче, еслиHTML-код даже немного выходит за ожидаемые параметры.

Сравните это с рекомендуемым решением, которое заключается в использовании DOM-парсера.Загрузите HTML-код в DOM-анализатор, и вы сразу получите объектную структуру, к которой вы можете запросить отдельные элементы и атрибуты.

Подробные данные, которые вы предоставили, делают это практически несложным делом.вместо регулярных выражений.

PHP имеет встроенный анализатор DOM, который вы можете вызвать следующим образом:

$mydom = new DOMDocument;
$mydom->loadHTMLFile("http://....");

Затем вы можете использовать XPath для поиска в DOM вашего конкретного элемента илиатрибут, который вы хотите:

$myxpath = new DOMXPath($mydom);
$myattr = $xpath->query("//td[@class="rdbot"]//img[0]@src");

Надеюсь, что поможет.

0 голосов
/ 28 мая 2011

Парсинг HTML с помощью Regex не рекомендуется, как уже упоминалось в нескольких постерах.

Однако если путь ваших изображений всегда следует шаблону src= "/ images / name.gif", вы можете легко извлечь его в Regex:

$pattern = <<<EOD 
#src\s*=\s*['"]/images/(.*?)["']# 
EOD;

Если вы уверены, что изображения всегда следуют по пути "/images/name.ext" и что вы неНеважно, где ссылка на изображение находится на странице, это сделает работу.Если у вас есть более подробные требования (такое сопоставление только внутри определенного класса), забудьте Regex, это не тот инструмент для работы.


Я просто прочитал в ваших комментариях, что вы должны соответствовать вконкретный тег.Используйте парсер, он избавит вас от невыразимых головных болей.

Если вы все еще хотите пройти через регулярные выражения, попробуйте следующее:

\(?<=<td .*?class\s*=\s*['"]rdBot['"][^<>]*?>.*?)(?<!</td>.*)<img [^<>]*src\s*=\s*["']/images/(.*?)["']\i

Это должно сработать.Это работает в C #, я не совсем уверен насчет бренда регулярных выражений в php.

0 голосов
/ 28 мая 2011
function GetFilename($file) {
    $filename = substr($file, strrpos($file,'/')+1,strlen($file)-strrpos($file,'/'));
    return $filename;
}
echo GetFilename('/images/buy_tickets.gif');

Это выведет buy_tickets.gif

0 голосов
/ 28 мая 2011

Вам нужны только изображения внутри тегов "td"?

$regex='/<img src="\/images\/([^"]*)"[^>]*>/im';

edit:

, чтобы получить конкретное изображение, которое должно работать:

$regex='/<td valign=\'top\' class=\'rdBot\' align=\'center\'>.*src="\/images\/([^"]*)".*<\/td>/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...