Соответствие атрибуту SRC тега IMG с использованием preg_match

Я пытаюсь запустить 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 store" />

Я получаю просто

0

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

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

PHP 4.4.7

Ответ 1

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

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

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

Ответ 2

Здесь можно сделать это со встроенными функциями (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

Try:

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

$html = 'bla <img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku\ 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.

Ответ 4

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

 preg_match('/(?<!_)src=([\'"])?(.*?)\\1/',$content, $matches);

Ответ 5

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

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

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

Ответ 6

Эта задача должна выполняться синтаксическим анализатором 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

Чисто, уместно, легко читается и управляется.

Ответ 8

preg_match ('~] * src\s? =\s? \' "~ я ', $ description, $ image);

        $img =  $image[1];

        if($img!="")
            return '<img class="img-fluid abbout_img" src="'.$img.'" />';
        else
            return "";