Preg_match на результате предыдущего preg_match

У меня есть этот код, который проходит через строку и выводит первый атрибут img's src = "".

Мне тоже нужно достать атрибут alt = "".

$first_image = '';
if ((preg_match('/<img[^>]*>/i', $article_fulltext, $matches ) == 1))
if (preg_match('/src = "([^"]*)"/', $matches[0], $morematches ) == 1)
$first_image = $morematches[0];

Что я пробовал, но не работал;

$first_image = '';
if ((preg_match('/<img[^>]*>/i', $article_fulltext, $matches ) == 1))
if (preg_match('/src = "([^"]*)"/', $matches[0], $morematches ) == 1)
if (preg_match('/alt = "([^"]*)"/', $matches[0], $morematchesAlt ) == 1)
$first_image = $morematches[0];
$first_image_alt = $morematchesAlt[0];

Что я сделал не так?

Вероятно, вам понадобятся фигурные скобки вокруг бита в финальном if, это нормально, если вы пропустите их с одним оператором, но для двух операторов нужны фигурные скобки.

Nigel Ren 01.08.2018 13:21

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

Nigel Ren 01.08.2018 13:22

@NigelRen Спасибо! То есть вроде if ((? ... Я вообще-то не понимаю, почему в первой строке стоит двойной ((. Я взял код из примера.

Jonas Borneland 01.08.2018 13:29

Больше похоже на ... $morematchesAlt ) == 1) { ... $morematchesAlt[0]; }

Nigel Ren 01.08.2018 13:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Согласитесь с мнением, что вы бы предпочли использовать DOMDocument, но для того, чтобы использовать свой код, вы должны немного изменить его, например:

<?php

$article_fulltext = '<html><body><img src = "imgSrc" alt = "imgAlt"></body></html>';

if (preg_match('/<img[^>]*>/i', $article_fulltext, $matches)) {
    preg_match('/src = "([^"]*)"/', $matches[0], $morematches);
    preg_match('/alt = "([^"]*)"/', $matches[0], $morematchesAlt);

    $first_image = $morematches[0];
    $first_image_alt = $morematchesAlt[0];

    var_dump($first_image);
    var_dump($first_image_alt);
}

Когда вы запустите этот скрипт - вы получите следующий результат:

string(12) "src = "imgSrc""
string(12) "alt = "imgAlt""

Спасибо !! .. Это тоже проверка наличия src и alt? Теперь, когда линия if исчезла с этих двух

Jonas Borneland 01.08.2018 13:32

@JonasB Да. Если $article_fulltext содержит образ, он проверит src и alt.

cn007b 01.08.2018 13:34

@JonasB Добро пожаловать в любое время ?

cn007b 01.08.2018 13:53

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

Кроме того, как уже упоминалось, регулярные выражения - не лучший способ синтаксического анализа HTML, поэтому вот решение с использованием DOMDocument:

<?php
    # Create a new DOMDocument instance and load the html content.
    $dom = new DOMDocument;
    $dom -> loadHTML($article_fulltext);

    # Cache the first image element.
    $img = $dom -> getElementsByTagName("img") -> item(0);

    # Print its 'src' and 'alt' attributes.
    echo $img -> getAttribute("src");
    echo $img -> getAttribute("alt");
?>

Стоит взглянуть на использование getAttribute.

Nigel Ren 01.08.2018 13:46

Да уж, @NigelRen! Я просто использую attributes -> getNamedItem(...) -> value в своем коде, потому что обычно мне нужно кэшировать объект атрибутов отдельно.

Angel Politis 01.08.2018 13:48

Спасибо! Приятно знать :-)

Jonas Borneland 01.08.2018 13:53

Другие вопросы по теме