Используя регулярные выражения для извлечения первого источника изображения из HTML-кодов?

Изменения, которые должны быть сделаны в манифесте Android:

android:configChanges="keyboardHidden|orientation" 

Внесены дополнения в действие:

public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}
20
задан Sinan Ünür 28 July 2009 в 23:42
поделиться

8 ответов

Хотя регулярные выражения могут быть полезны для большого количества задач, я считаю, что обычно они не работают при синтаксическом анализе HTML. ДОМ. Проблема с HTML заключается в том, что структура вашего документа настолько изменчива, что трудно точно (и под точным я имею в виду 100% успех без ложных срабатываний) извлечь тег.

Я рекомендую вам использовать Парсер DOM, такой как SimpleHTML , и используйте его как таковой:

function get_first_image($html) {
    require_once('SimpleHTML.class.php')

    $post_html = str_get_html($html);

    $first_img = $post_html->find('img', 0);

    if($first_img !== null) {
        return $first_img->src;
    }

    return null;
}

Некоторые могут подумать, что это излишество, но, в конце концов, это будет легче поддерживать, а также обеспечит большую расширяемость. Например, с помощью парсера DOM я также могу получить атрибут alt.

Можно разработать регулярное выражение для достижения той же цели, но оно будет ограничено таким образом, чтобы принудительно использовать атрибут alt быть после src или наоборот, и преодоление этого ограничения усложнит регулярное выражение.

Также учтите следующее. Чтобы правильно сопоставить тег с использованием регулярных выражений и получить только атрибут src (захваченный в группе 2), вам понадобится следующее регулярное выражение:

<\s*?img\s+[^>]*?\s*src\s*=\s*(["'])((\\?+.)*?)\1[^>]*?>

И затем снова , указанное выше может завершиться ошибкой, если:

  • Имя атрибута или тега написано заглавными буквами и модификатор i не используется.
  • Кавычки вокруг атрибута src не используются.
  • Другой атрибут, затем src , где-то в своем значении использует символ > .
  • Некоторые другую причину я не предвидел.

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


РЕДАКТИРОВАТЬ: Если вам нужны все изображения:

function get_images($html){
    require_once('SimpleHTML.class.php')

    $post_dom = str_get_dom($html);

    $img_tags = $post_dom->find('img');

    $images = array();

    foreach($img_tags as $image) {
        $images[] = $image->src;
    }

    return $images;
}
40
ответ дан 29 November 2019 в 22:38
поделиться

Это работает для меня:

preg_match('@<img.+src="(.*)".*>@Uims', $html, $matches);
$src = $matches[1];
7
ответ дан 29 November 2019 в 22:38
поделиться

Используйте это, более эффективно:

preg_match_all('/<img [^>]*src=["|\']([^"|\']+)/i', $html, $matches);
foreach ($matches[1] as $key=>$value) {
    echo $value."<br>";
}

Пример:

$html = '
<ul>     
  <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li>       
  <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li>      
  <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value1.jpg" />
  <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value2.jpg" />
  <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li>     
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value3.jpg" />
</ul>
<img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="res/upload.jpg" />
  <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li>       
  <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li>      
  <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value4.jpg" />
  <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li>      
  <img src="value5.jpg" />
  <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li>     
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value6.jpg" />
';   
preg_match_all('/<img .*src=["|\']([^"|\']+)/i', $html, $matches);
foreach ($matches[1] as $key=>$value) {
    echo $value."<br>";
} 

Вывод:

value1.jpg
value2.jpg
value3.jpg
res/upload.jpg
value4.jpg
value5.jpg
value6.jpg
12
ответ дан 29 November 2019 в 22:38
поделиться

Я не знаю, ДОЛЖНЫ ли вы использовать регулярное выражение чтобы получить свои результаты. Если нет, вы можете попробовать simpleXML и XPath, которые будут намного более надежными для вашей цели:

Сначала импортируйте HTML в объект документа DOM. Если вы получаете ошибки, отключите их для этой части и обязательно включите их позже:

 $dom = new DOMDocument();
 $dom -> loadHTMLFile("filename.html");

Затем импортируйте DOM в объект simpleXML, например:

 $xml = simplexml_import_dom($dom);

Теперь вы можете использовать несколько методов, чтобы получить все элементы изображения (и их атрибуты) в массив. Я предпочитаю XPath, потому что мне больше повезло с обходом с ним DOM:

 $images = $xml -> xpath('//img/@src');

Эта переменная теперь может обрабатываться как массив URL-адресов ваших изображений:

 foreach($images as $image) {
    echo '<img src="$image" /><br />
    ';
  }

Presto, все ваши изображения, ни один из жир.

Вот неаннотированная версия вышеизложенного:


 $dom = new DOMDocument();
 $dom -> loadHTMLFile("filename.html");

 $xml = simplexml_import_dom($dom);

 $images = $xml -> xpath('//img/@src');

 foreach($images as $image) {
    echo '<img src="$image" /><br />
    ';
  }
2
ответ дан 29 November 2019 в 22:38
поделиться

я предполагаю, что все ваши src = have "вокруг URL

<img[^>]+src=\"([^\"]+)\"

другие ответы, размещенные здесь, делают другие предположения о вашем коде

5
ответ дан 29 November 2019 в 22:38
поделиться

Я согласен с Эндрю Муром. Использование DOM намного лучше. Коллекция изображений HTML DOM вернет вам ссылку на все объекты изображений.

Допустим, в вашем заголовке у вас есть

<script type="text/javascript">
    function getFirstImageSource()
    {
        var img = document.images[0].src;
        return img;
    }
</script>

, а затем в вашем теле у вас есть

<script type="text/javascript">
  alert(getFirstImageSource());
</script>

Это вернет 1-й источник изображения. Вы также можете просмотреть их в цикле по строкам, (в разделе заголовка)

function getAllImageSources()
    {
        var returnString = "";
        for (var i = 0; i < document.images.length; i++)
        {
            returnString += document.images[i].src + "\n"
        }
        return returnString;
    }

(в теле)

<script type="text/javascript">
  alert(getAllImageSources());
</script>

. Если вы используете для этого JavaScript, помните, что вы не можете запускать свою функцию в цикле через коллекцию изображений в вашем заголовке. Другими словами, вы не можете сделать что-то подобное

<script type="text/javascript">
    function getFirstImageSource()
    {
        var img = document.images[0].src;
        return img;
    }
    window.onload = getFirstImageSource;  //bad function

</script>

, потому что это не сработает. Изображения не загружаются при выполнении заголовка, поэтому вы получите нулевой результат.

Надеюсь, это поможет в какой-то мере. Если возможно, я бы использовал DOM. Вы'

2
ответ дан 29 November 2019 в 22:38
поделиться

Вы можете попробовать следующее:

preg_match_all("/<img\s+src=\"(.+)\"/i", $html, $matches);
foreach ($matches as $key=>$value) {
    echo $key . ", " . $value . "<br>";
}
1
ответ дан 29 November 2019 в 22:38
поделиться

, поскольку вы не беспокоитесь о проверке HTML, вы можете сначала попробовать использовать strip_tags () в тексте, чтобы убрать большую часть мусора.

Затем вы можете найти такое выражение, как

"/\<img .+ \/\>/i"

Обратные косые черты экранируют специальные символы, такие как <,>, /. . + настаивает на том, чтобы внутри тега img было 1 или более любых символов Вы можете записать часть выражения, заключив ее в круглые скобки. например (. +) захватывает среднюю часть тега img.

Когда вы решаете, какую часть середины вы хотите конкретно захватить, вы можете изменить (. +) на что-то более конкретное.

1
ответ дан 29 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: