У меня есть этот код, который проходит через строку и выводит первый атрибут 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];
Что я сделал не так?
Я также рекомендовал бы попробовать использовать что-то вроде DOMDocument, а не регулярное выражение для обработки HTML.
@NigelRen Спасибо! То есть вроде if ((? ... Я вообще-то не понимаю, почему в первой строке стоит двойной ((. Я взял код из примера.
Больше похоже на ... $morematchesAlt ) == 1) { ... $morematchesAlt[0]; }






Согласитесь с мнением, что вы бы предпочли использовать 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 исчезла с этих двух
@JonasB Да. Если $article_fulltext содержит образ, он проверит src и alt.
@JonasB Добро пожаловать в любое время ?
Ваш код страдает от отсутствия фигурных скобок для правильного определения структуры ваших условных операторов. Всякий раз, когда вы используете несколько операторов в рамках предложения 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.
Да уж, @NigelRen! Я просто использую attributes -> getNamedItem(...) -> value в своем коде, потому что обычно мне нужно кэшировать объект атрибутов отдельно.
Спасибо! Приятно знать :-)
Вероятно, вам понадобятся фигурные скобки вокруг бита в финальном
if, это нормально, если вы пропустите их с одним оператором, но для двух операторов нужны фигурные скобки.