Соответствующий атрибут SRC тега IMG с использованием preg_match - PullRequest
14 голосов
/ 02 февраля 2010

Я пытаюсь запустить preg_match, чтобы извлечь атрибут SRC из первого тега IMG в статье (в данном случае хранится в $ row-> introtext).

preg_match('/\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\']*)/i', $row->introtext, $matches);

Вместо получения чего-либокак

images/stories/otakuzoku1.jpg

из

<img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku's store" />

Я получаю только

0

Регулярное выражение должно быть правильным, но я не могу сказать, почему оно выглядит соответствующиматрибут border, а не атрибут src.

В качестве альтернативы, если у вас хватило терпения прочитать это далеко, не переходя прямо к полю ответа и введя «использовать синтаксический анализатор HTML / XML», можно получить хороший учебник.для одного рекомендовать, так как у меня возникают проблемы с поиском такого, который применим к PHP 4.

PHP 4.4.7

Ответы [ 6 ]

34 голосов
/ 02 февраля 2010

Ваше выражение неверно. Попробуйте:

preg_match('/< *img[^>]*src *= *["\']?([^"\']*)/i', $row->introtext, $matches);

Обратите внимание на удаление скобок вокруг img и src и некоторых других очисток.

5 голосов
/ 02 февраля 2010

Вот способ сделать это с помощью встроенных функций (php> = 4):

$parser = xml_parser_create();
xml_parse_into_struct($parser, $html, $values);
foreach ($values as $key => $val) {
    if ($val['tag'] == 'IMG') {
        $first_src = $val['attributes']['SRC'];
        break;
    }
}

echo $first_src;  // images/stories/otakuzoku1.jpg
3 голосов
/ 28 июня 2013

Если вам нужно использовать preg_match(), попробуйте следующее:

 preg_match('/(?<!_)src=([\'"])?(.*?)\\1/',$content, $matches);
2 голосов
/ 02 февраля 2010

Попробуйте:

include ("htmlparser.inc"); // from: http://php-html.sourceforge.net/

$html = 'bla <img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku\'s store" /> noise <img src="das" /> foo';

$parser = new HtmlParser($html);

while($parser->parse()) {
    if($parser->iNodeName == 'img') {
        echo $parser->iNodeAttributes['src'];
        break;
    }
}

, который будет производить:

images/stories/otakuzoku1.jpg

Должно работать с PHP 4.x.

1 голос
/ 15 мая 2019

Эта задача должна выполняться синтаксическим анализатором dom, поскольку регулярное выражение игнорирует dom.

Код: ( Демо )

$row = (object)['introtext' => '<div>test</div><img src="source1"><p>text</p><img src="source2"><br>'];

$dom = new DOMDocument();
$dom->loadHTML($row->introtext);
echo $dom->getElementsByTagName('img')->item(0)->getAttribute('src');

Выход:

source1

Это говорит:

  1. Разобрать всю строку html
  2. Изолировать все теги img
  3. Изолировать первый тег img
  4. Изолировать значение атрибута src

Чистота, удобство, простота чтения и управления.

1 голос
/ 28 сентября 2010

Регулярное выражение, которое я использовал, было намного проще. Мой код предполагает, что передаваемая строка содержит ровно один тег img без другой разметки:

$pattern = '/src="([^"]*)"/';

См. Мой ответ здесь для получения дополнительной информации: Как извлечь img src, title и alt из html с помощью php?

...