- Как извлечь img src, title и alt из html с помощью php?
- 21 ответ
- EDIT: теперь, когда я лучше знаю
- Решение С regexp
- Как работает этот материал?
- Извлечение данных с помощью регулярных выражений PHP
- Текст из скобок
- Результат:
- Текст из HTML тегов
- Результат:
- URL из текста
- Результат:
- href из ссылок
- Результат:
- Анкоры ссылок
- Результат:
- Src из тегов img
- Результат:
- E-mail адреса из текста
- Результат:
- Цвета
- HEX/HEXA
- Результат:
- RGB/RGBA
- Поиск url изображений
- Поиск url изображений
Как извлечь img src, title и alt из html с помощью php?
Я хотел бы создать страницу, где все изображения, которые находятся на моем сайте, перечислены с заголовком и альтернативным представлением. Я уже написал мне небольшую программу для поиска и загрузки всех HTML файлов, но теперь я застрял в том, как извлечь src , title и alt из этого HTML:
Я предполагаю, что это должно быть сделано с некоторым регулярным выражением, но поскольку порядок тегов может отличаться, и мне все они нужны, я действительно не знаю, как это разбираться элегантным способом (я мог бы сделать это жесткий char способом char, но это больно).
21 ответ
EDIT: теперь, когда я лучше знаю
Использование regexp для решения этой проблемы — плохая идея и, вероятно, приведет к недостижимому и ненадежному коду. Лучше использовать парсер HTML.
Решение С regexp
В этом случае лучше разбить процесс на две части:
Я предполагаю, что ваш документ не является строгим xHTML, поэтому вы не можете использовать синтаксический анализатор XML. НАПРИМЕР. с этим исходным кодом веб-страницы:
/* preg_match_all match the regexp in all the $html string and output everything as an array in $result. "i" option is used to make it case insensitive */ preg_match_all('/
]+>/i',$html, $result); print_r($result); Array ( [0] => Array ( [0] => [1] =>
[2] =>
[3] =>
[4] =>
[. ] ) )
Затем мы получаем все атрибуты тега img с помощью цикла:
$img = array(); foreach( $result as $img_tag) < preg_match_all('/(alt|title|src)=("[^"]*")/i',$img_tag, $img[$img_tag]); >print_r($img); Array ( [ ] => Array ( [0] => Array ( [0] => src="/Content/Img/stackoverflow-logo-250.png" [1] => alt="logo link to homepage" ) [1] => Array ( [0] => src [1] => alt ) [2] => Array ( [0] => "/Content/Img/stackoverflow-logo-250.png" [1] => "logo link to homepage" ) ) [
] => Array ( [0] => Array ( [0] => src="https://overcoder.net/content/img/vote-arrow-up.png" [1] => alt="vote up" [2] => title="This was helpful (click again to undo)" ) [1] => Array ( [0] => src [1] => alt [2] => title ) [2] => Array ( [0] => "/content/img/vote-arrow-up.png" [1] => "vote up" [2] => "This was helpful (click again to undo)" ) ) [
] => Array ( [0] => Array ( [0] => src="https://overcoder.net/content/img/vote-arrow-down.png" [1] => alt="vote down" [2] => title="This was not helpful (click again to undo)" ) [1] => Array ( [0] => src [1] => alt [2] => title ) [2] => Array ( [0] => "/content/img/vote-arrow-down.png" [1] => "vote down" [2] => "This was not helpful (click again to undo)" ) ) [
] => Array ( [0] => Array ( [0] => src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG" [1] => alt="gravatar image" ) [1] => Array ( [0] => src [1] => alt ) [2] => Array ( [0] => "http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG" [1] => "gravatar image" ) ) [..] ) )
Regexps имеют интенсивность процессора, поэтому вам может понадобиться кэшировать эту страницу. Если у вас нет системы кэширования, вы можете настроить свою собственную, используя ob_start и загрузку/сохранение из текстового файла.
Как работает этот материал?
Сначала мы используем preg_ match_ all, функцию, которая получает каждую строку, соответствующую шаблону, и выводит ее в третий параметр.
Мы применяем его на всех веб-страницах html. Его можно прочитать, поскольку каждая строка, начинающаяся с » » char и заканчивается нa > .
Мы применяем его последовательно на каждом теге img. Он может быть прочитан как каждая строка, начинающаяся с «alt», «title» или «src», затем «=», затем «,» куча вещей, которые не являются «и заканчивается символом» «, Изолировать подстроки между().
Наконец, каждый раз, когда вы хотите иметь дело с регулярными выражениями, удобно иметь хорошие инструменты для быстрого тестирования. Проверьте этот онлайн-тестер регулярных выражений.
EDIT: ответьте на первый комментарий.
Это правда, что я не думал о (надеюсь, несколько) людей, использующих одинарные кавычки.
Ну, если вы используете только ‘, просто замените все на.
Если вы смешиваете оба. Сначала вы должны пощекотать себя:-), затем попытайтесь использовать ( «|» ) вместо или «и [^ ø], чтобы заменить [^» ].
Единственная проблема — одиночные кавычки: не будет работать, регулярное выражение ожидает «все время»
Я НЕ рекомендовал бы прокручивать вниз (хорошо, сделайте прокрутку, чтобы проверить это): хотя код кажется простым и поэтому заманчивым для использования людьми, DOMDocument имеет слишком много накладных расходов, когда вы просто хотите получить атрибуты из тега. ..
Это решение хорошо, если: вы не знаете тег для анализа html, у вас есть 1 строка html и вам нужно 1-2 атрибута. Загрузка DOMDoc требует много памяти, что бесполезно, если вы не анализируете весь документ.
Извлечение данных с помощью регулярных выражений PHP
Получение данных с помощью функций preg_match() и preg_match_all() .
Текст из скобок
Извлечение содержимого из круглых, квадратных и фигурных скобок:
$text = ' Телеобъектив: диафрагма [ƒ/2.8] Широкоугольный объектив: (диафрагма ƒ/1.8) По беспроводной сети: Поддержка диапазона: '; /* [. ] */ preg_match_all("/\[(.+?)\]/", $text, $matches); print_r($matches[1]); /* (. ) */ preg_match_all("/\((.+?)\)/", $text, $matches); print_r($matches[1]); /* */ preg_match_all("/\<(.+?)\>/", $text, $matches); print_r($matches[1]); /* */ preg_match_all("/\<(.+?)\>/", $text, $matches); print_r($matches[1]);
Результат:
Array ( [0] => ƒ/2.8 ) Array ( [0] => диафрагма ƒ/1.8 ) Array ( [0] => до 13 часов ) Array ( [0] => Dolby Vision и HDR10 )
Текст из HTML тегов
$text = ' Тег H1
Текст 1
Текст 2
'; /* */ preg_match('/]*?>(.*?)/si', $text, $matches); echo $matches[1]; /* */ preg_match('/]*?>(.*?)/si', $text, $matches); echo $matches[1]; /* Извлекает текст из всех
*/ preg_match_all('/
]*?>(.*?)/si', $text, $matches); print_r($matches[1]);
Результат:
Тег TITLE Тег H1 Array ( [0] => Текст 1 [1] => Текст 2 )
URL из текста
$text = 'Text http://ya.ru text http://google.ru text.'; preg_match_all('/(http:\/\/|https:\/\/)?(www)?([\da-z\.-]+)\.([a-z\.])([\/\w\.-\?\%\&]*)*\/?/i', $text, $matches); print_r($matches[0]);
Результат:
Array ( [0] => http://ya.ru [1] => http://google.ru )
href из ссылок
$text = ' Яндекс Google Mail.ru '; preg_match_all('//i', $text, $matches); print_r($matches[1]);
Результат:
Array ( [0] => http://ya.ru [1] => http://google.ru [2] => http://mail.ru )
Анкоры ссылок
$text = ' Яндекс Google Mail.ru '; preg_match_all('/(.*?)/i', $text, $matches); print_r($matches[1]);
Результат:
Array ( [0] => Яндекс [1] => Google [2] => Mail.ru )
Src из тегов img
$text = 'text text'; preg_match_all('//is', $text, $matches); print_r($matches[1]);
Результат:
E-mail адреса из текста
$text = 'text admin@mail.ru text text text admin@ya.ru'; preg_match_all('/([a-z0-9_\-]+\.)*[a-z0-9_\-]+@([a-z0-9][a-z0-9\-]*[a-z0-9]\.)+[a-z]/i', $text, $matches); print_r($matches[0]);
Результат:
Array ( [0] => admin@mail.ru [1] => admin@ya.ru )
Цвета
HEX/HEXA
$css = ' body < color: #000; background: #4545; >header < color: #111111; background: #00000080; >'; preg_match_all('/#(?:[0-9a-f])/i', $css, $matches); print_r($matches[0]);
Результат:
Array ( [0] => #000 [1] => #4545 [2] => #111111 [3] => #00000080 )
RGB/RGBA
$css = ' body < color: rgb(0,0,0); background: rgba(17,85,68,0.33); >header < color: rgb(17,17,17); background: rgba(0,0,0,0.5); >'; preg_match_all('/((rgba)\((\d,\s?)(1|0?\.?\d+)\)|(rgb)\(\d(,\s?\d)\))/i', $css, $matches); print_r($matches[0]);
Array ( [0] => rgb(0,0,0) [1] => rgba(17,85,68,0.33) [2] => rgb(17,17,17) [3] => rgba(0,0,0,0.5) )
Поиск url изображений
Здравствуйте, никак не могу составить регулярку для поиска url изображений на странице.
~]*/>~ такое выводит мне полностью тэг img со всем содержимым, но мне нужен только url, указанный в src.
Для меня это дремучий лес, но я попробовал такое выражение: ~src=»»*/»»~. Вроде бы должно искаться все, что идет после src и в кавычках.
Помогите мне, пожалуйста, составить правильное выражение. Заранее спасибо
Смена изображений с URL
Здравствуйте, помогите найти решение вопросу по смене картинок с ссылками, в боковом виджете? Чтобы.
Загрузка изображений по URL на удаленный сервер
Добрый день! помогите с загрузкой картинок на сервер с url-а. 🙂 В общем Есть переменная которая.
Загрузка изображений по URL с разбивкой на дерриктории
Всем привет. Есть необходимость скачать несколько десятков тысяч картинок на компьютер. У меня.
Алгоритм загрузки изображений из excel по ссылке URL в реквизит основное изображение
Добрый день. Есть стандартная обработка "ЗагрузкаДанныхИзТабличногоДокумента" В событии при записи.
if (preg_match_all('/]*?)?\\bsrc\\s*=\\s*(?|"([^"]*)"|\'([^\']*)\'|([^<>\'"\\s]*))[^<>]*>/i', $text, $m)) print_r($m[1]); // ошибка: // было: "(^["]*)" // надо: "([^"]*)"
Спасибо большое, а можно чуть-чуть объяснить? Я пытался разобраться с помощью руководств, но так и не понял, к сожалению. И в $m будет только первое вхождение подстроки или все? И если все, то как к ним обращаться? $m[1], $m[2]. или $m[1][0], $m[1][1] . ?
/]*? # любые символы, кроме «», сколько угодно )? # необязательно \b # граница слова src # «src» \s* # необязательно пробельные символы = # «=» \s* # необязательно пробельные символы (?| # значение атрибута ловим в $1 с помощью сброса ветвления "([^"]*)" # значение в кавычках | # или '([^']*)' # значение в апострофах | # или ([^<>'"\s]*) # тупо значение без кавычек и апострофов ) # [^<>]* # любые символы, кроме «» (другие атрибуты) > # «>» /ix
preg_match_all() ловит все совпадения. В $m в данном случае будет двумерный массив вида $m[номер-скобки][номер-вхождения] , благодаря чему мы можем выбрать все совпадения скобки 1 из всех совпавших подстрок: $m[1] . Если указать в preg_match_all() флаг PREG_SET_ORDER , то получится инач картина: $m[номер-вхождения][номер-скобки] , где мы наоборот можем выбрать все совпавшие скобки из очередной совпавшей подстроки.
PS: В выражении была ошибка. Надо «([^»]*)» вместо «(^[«]*)» .
Поиск url изображений
Здравствуйте, никак не могу составить регулярку для поиска url изображений на странице.
~]*/>~ такое выводит мне полностью тэг img со всем содержимым, но мне нужен только url, указанный в src.
Для меня это дремучий лес, но я попробовал такое выражение: ~src=»»*/»»~. Вроде бы должно искаться все, что идет после src и в кавычках.
Помогите мне, пожалуйста, составить правильное выражение. Заранее спасибо
Смена изображений с URL
Здравствуйте, помогите найти решение вопросу по смене картинок с ссылками, в боковом виджете? Чтобы.
Загрузка изображений по URL на удаленный сервер
Добрый день! помогите с загрузкой картинок на сервер с url-а. 🙂 В общем Есть переменная которая.
Загрузка изображений по URL с разбивкой на дерриктории
Всем привет. Есть необходимость скачать несколько десятков тысяч картинок на компьютер. У меня.
Алгоритм загрузки изображений из excel по ссылке URL в реквизит основное изображение
Добрый день. Есть стандартная обработка "ЗагрузкаДанныхИзТабличногоДокумента" В событии при записи.
if (preg_match_all('/]*?)?\\bsrc\\s*=\\s*(?|"([^"]*)"|\'([^\']*)\'|([^<>\'"\\s]*))[^<>]*>/i', $text, $m)) print_r($m[1]); // ошибка: // было: "(^["]*)" // надо: "([^"]*)"
Спасибо большое, а можно чуть-чуть объяснить? Я пытался разобраться с помощью руководств, но так и не понял, к сожалению. И в $m будет только первое вхождение подстроки или все? И если все, то как к ним обращаться? $m[1], $m[2]. или $m[1][0], $m[1][1] . ?
/]*? # любые символы, кроме «», сколько угодно )? # необязательно \b # граница слова src # «src» \s* # необязательно пробельные символы = # «=» \s* # необязательно пробельные символы (?| # значение атрибута ловим в $1 с помощью сброса ветвления "([^"]*)" # значение в кавычках | # или '([^']*)' # значение в апострофах | # или ([^<>'"\s]*) # тупо значение без кавычек и апострофов ) # [^<>]* # любые символы, кроме «» (другие атрибуты) > # «>» /ix
preg_match_all() ловит все совпадения. В $m в данном случае будет двумерный массив вида $m[номер-скобки][номер-вхождения] , благодаря чему мы можем выбрать все совпадения скобки 1 из всех совпавших подстрок: $m[1] . Если указать в preg_match_all() флаг PREG_SET_ORDER , то получится инач картина: $m[номер-вхождения][номер-скобки] , где мы наоборот можем выбрать все совпавшие скобки из очередной совпавшей подстроки.
PS: В выражении была ошибка. Надо «([^»]*)» вместо «(^[«]*)» .