Насколько понимаю задачу, нужно что-то типа этого:
preg_match_all( '#]*\ssrc=(?:\'|")(.+?\..+?)(?:\'|")[^>]*>#i',$shortnews,$total);
Регулярное выражение между решетками означает:
- ]* - в строке дальше могут идти какие-либо символы, кроме закрывающей угловой скобки;
- \s - идет пробельный символ (не только пробел, но и его вариации - короткий, длинный; табуляция, перенос строки и т. д.);
- src= - идет последовательность символов "src=";
- (?:\'|") - идет двойная или одинарная кавычка; скобками означаем границы для знака ИЛИ (вертикальная черта), а символы "?:" означают, что этот скобочный набор не надо отправлять в итоговый массив $total;
- (.+?\..+?) - идет ЧТО-ТО, точка, потом еще ЧТО-ТО (точка означает "любой символ", плюс - что он идет один и более раз, а "+?" - что ищем минимальный подходящий набор, т.е. при нахождении точки (обозначена символом "\.", т.е. ищем именно символ точки, а не "любой символ") первая группа символов ".+?" заканчивается, после точки ищется еще одна);
- (?:\'|") - снова одинарная/двойная кавычка;
- [^>]* - от 0 до бесконечности символов, кроме закрывающей скобки
- > - закрывающая скобка.
символ "i" после решетки означает регистронезависимость.
По итогу в массив $total будут попадать все теги , где элемент с номером "1" - это урл картинки. Т.е.:
- $total[0][0] - полное совпадение с шаблоном, весь тег ;
- $total[0][1] - совпадение с маской в скобках, непосредственно урл картинки.