Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Самая сложная регулярка в мире


Автор: gendelman 25.9.2008, 12:04
Задумал я в html-документе в теге <img...> все пути к изображению на абсолютные заменить а заодно и атрибуты тега на свой манер исправить. И все, естественно, ЗА ОДИН ПРОХОД. 

Заранее не известно, какого вида пути к картинкам в конкретном документе, но понятно, варианта есть три:
Код

<img src="http://site.com/photo/album/pics.jpg">
<img src="/photo/album/pics.jpg">
<img src="pics.jpg">

Сначала всё казалось простым - брать из тега картинку, (не зависимо - полный у неё путь или нет)
и заменять на уже с подставленным полным путем. Но так не годиться - вдруг это изображение с внешнего рессурса? Т.е полные пути трогать не надо. Можно, чтобы регулярка обходила теги с полным путем, но тогда не заменятся атрибуты тега.
Для компенсации недостающих путей заранее заготовил:
Код

$full  = 'http://site.com/photo/album/';
$short = 'http://site.com';

Вот предмет мучений:
Код

preg_replace ('#<img src=("http://[^"]*?")?("/[^"]*?")?("[^"]*?")?[^>]*?>#si', 'replacement', $html);
// Слеши для простоты не экранирую

Получилось, что если путь к картике полный то он вместе с названием изображения помещается в $1 функции, а $2 и $3 остаются пустыми, если относительный, то в $2, пустые $1 и $3, ну а если пути вообще нет, то в $3, $1 и $2 - пусто. 

Полученный результат я собирался как-то использовать в параметре replacement, т.е. в зависимости от наличия/отсутствия содержимого в $1 $2 $3 подставлять туда $full или $short или ничего не подставлять но... 
Начинает казаться, что $1 $2 $3 - это исключительно внутренние переменные функции preg_replace или я чего-то не понимаю? Или я вообще не в правильном направлении двигаюсь?

В два-то приёма я сделал, но душа просит в один.  smile  smile  smile 
Подскажите решение.

Автор: teroni 25.9.2008, 12:25
Посмотрите в сторону модификатора /e в шаблоне и проверки на пустоту в замещаемом выражении.

Автор: Wolf1994 25.9.2008, 12:35
Для сложных условий лучше всего подходит: http://ru2.php.net/manual/ru/function.preg-replace-callback.php.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)