Помогите с регуляркой PHP preg_match_all

Рейтинг: 0Ответов: 2Опубликовано: 29.04.2015

Т.к. вы любите подробности то с них и начну ;) Написал человеку сайт. В Админке статьи добавляются с помощью CKEditor с функцией вставить картинку =) Ну и человек постоянно вставляет картинки, иногда лишние... В общем накопилось много мусора в картинках. Решил написать скрипт с кнопкой в админке, чтобы искала во всех статьях тег <img src="имя картинки">, потом сканируем папку images и сравниваем файлы. Те что в статьи не входят удаляем. Но регулярные выражения хромают у меня =(

код: $txt = "text text text text text text <img width="100%" src="имя файла картинки" class="какой то класс"> text text text text text text text "

preg_match_all (найти **ТОЛЬКО** содержимое **SRC**, без кавычек)

Помогите написать регулярку.

Ответы

▲ 1Принят

Сейчас прибежит @Vlad и будет ругаться за регулярки в отношении HTML.
Но можно так:

$txt = 'text text text text text text <img width="100%" src="имя файла картинки" class="какой то класс"> text text text text text <img class="dlsfj" src=\'pathToImg\' />text text ';
preg_match_all('!<img[^>]+src=[\'"](.*?)[\'"]!', $txt, $matches);

В $matches[1] будут пути.

▲ 3

Предложу альтернативный вариант с парсером (пушо у нас его всегда рекомендуют, но сам процесс не показывают). Понадобится установленный и подключенный symfony/dom-crawler и symfony/css-selector (при умении работать с XPath второй необязателен):

use Symfony\Component\DomCrawler\Crawler;

class PostParser
{
    public static function parseImageSources($html)
    {
        $sources = array();
        $crawler = new Crawler($html);
        foreach ($crawler->filter('img') as $node) {
            if ($source = $node->getAttribute('src')) {
                $sources[] = $source;
            }
        }
        return $sources;
    }
}

Плюсы:

  • Написал буквально на коленке
  • Всего-то около десяти строчек, не так страшно, как могло бы быть
  • Нет возможности набедокурить с регуляркой