Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: изменить у ссылки картинки адресс
 
 автор: TavRoX   (01.02.2013 в 20:26)   письмо автору
 
 

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

Было:
http://blblb.com/tiny/upload-files/aquarium/aquarium-1.jpg
../tiny/upload-files/aquarium/aquarium-1.jpg
Нужно что бы стало
http://blblb.com/tiny/upload-files/aquarium/mcith/aquarium-1.jpg
../tiny/upload-files/aquarium/mcith/aquarium-1.jpg


как єто осуществить? кто может сделать регулярку буду очень благодарен, и если пояснит ьчт ок чему также буду благодарен

  Ответить  
 
 автор: heed   (02.02.2013 в 02:38)   письмо автору
 
   для: TavRoX   (01.02.2013 в 20:26)
 

это ../tiny/upload-files/aquarium/mcith/aquarium-1.jpg в html-коде , в ссылке или в картинке , в каком теге ?
, если без разницы где менять, то str_replace('/aquarium/', '/aquarium/mcith/', $txt);

  Ответить  
 
 автор: TavRoX   (02.02.2013 в 11:28)   письмо автору
 
   для: heed   (02.02.2013 в 02:38)
 

только в картинке
и тут прикол что слово aquarium это так для примера, оно будет менятся всегда

  Ответить  
 
 автор: heed   (02.02.2013 в 13:23)   письмо автору
 
   для: TavRoX   (02.02.2013 в 11:28)
 

может быть что-то такое
<xmp>
<?php
$txt 
'
<img src="../tiny/upload-files/aquarium/img-1.jpg"/>
<img alt="alt" src="http://......com/upload-files/img/aquarium-1.jpg"/>
'
;
echo 
$txtpreg_replace('#(<img[^>]+?\bsrc=["\'](?:[^"\'/>]*/)+)'
        
.'([^"\'>]*["\'])#i''$1_word_/$2'$txt);
если заменяет и там где не надо, то нужны какие-то отличительные признаки, может upload-files/ обязательно должно присутствовать, или ещё чего, там где [^"\'/>]*
, или не там

  Ответить  
 
 автор: TavRoX   (02.02.2013 в 13:39)   письмо автору
 
   для: heed   (02.02.2013 в 13:23)
 

попробую отпишусь. спасибо заранее)

  Ответить  
 
 автор: TavRoX   (02.02.2013 в 13:48)   письмо автору
 
   для: heed   (02.02.2013 в 13:23)
 

бомба!!!! спасибо пашет)

  Ответить  
 
 автор: TavRoX   (02.02.2013 в 13:50)   письмо автору
 
   для: heed   (02.02.2013 в 13:23)
 

а можно еще добавить такой параметр, который будет отсеивать картинки с шириной меньше заданного размера?

  Ответить  
 
 автор: heed   (02.02.2013 в 16:50)   письмо автору
 
   для: TavRoX   (02.02.2013 в 13:50)
 

Сложно ответить что-то конкретное, тем-более с кодом.
Если под шириной имеется ввиду что присутствует атрибут width=\d+
, то логически, т.к. два аттрибута могут идти в любом порядке ,доставать его в основном шаблоне можно например так
<img... (width=\d+)?...(src=....)...(width=\d+)?
проверяя до и после
или так
<img(?=.*width=\d+)?...(src=....)
т.е. заставляя анализировать строку после '<img' дважды , сначала проверить есть-ли одно
(с таким подходом ещё как-то можно представить что проверить надо больше двух аттрибутов, но всётаки)

или
<?
 
function prc_f($m) {
  
# здесь проверка полученных $m[0] $m[1] $m[2] ... это $0 $1 $2... действия над ними,
 # И возврат строки замены. Или неизменённое $m[0], или вообще ''
// ........
 
print_r($m);
 return 
$m[0];
}
$txt preg_replace_callback($regexp'prc_f'$txt);

Чем больше усложняется щаблон, тем больше вероятность что preg_replace_callback() с более простым шаблоном + дополнительные проверки совпадений будут намного быстрее.

Четвёртый вариант, например тоже с preg_replace_callback , разбор всех аттрибутов.
и в некоторых случаях единственно правильный выход.

Есть ещё DOM, его мне не приходилось юзать

Или если ширина картинки определяется непосредственно из файла картинки каким-нибудь EXIF, то тоже однозначно preg_replace_callback(), шаблоны с '/.../e' в основном себя не оправдывают

//вообще, мне для своих мелких нужд практически даже не приходится юзать такие конструкции
, типа width\s*=\s*["\']?\d+....
Если теги все с двойными кавычками, и пробелов никаких возле =, или все теги img начинаются строго с '<img src='
нафига тогда я буду каждый раз городить огороды этих ненужных вариантов, даже если они поддерживабтся какими-то стандартами.

  Ответить  
 
 автор: TavRoX   (02.02.2013 в 16:54)   письмо автору
 
   для: heed   (02.02.2013 в 16:50)
 

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

или же по другому, после всего этого, провести еще одну операцию с текстом выбрать все картинки у которых ширина больше 200 и убрать оттуда слово mcith/

  Ответить  
 
 автор: heed   (02.02.2013 в 17:09)   письмо автору
 
   для: TavRoX   (02.02.2013 в 16:54)
 

если width= обязательно до, или обязательно после src=, то одним выражением не намного сложнее. если по разному то возможно второй вариант.

  Ответить  
 
 автор: heed   (02.02.2013 в 17:02)   письмо автору
 
   для: TavRoX   (02.02.2013 в 13:50)
 

иногда проще весь текст пройти парой шаблонов попроще, чем один раз чем-то навороченым

// upd
дольше 4х минут подбирал слова :)

  Ответить  
 
 автор: TavRoX   (02.02.2013 в 17:38)   письмо автору
 
   для: heed   (02.02.2013 в 17:02)
 

думаю сделать так
тот первый вариант который был делается, а затем после него какой то вариант с отсевом картинок с шириной больше 200 после срч что бы убирал слово mcith/ из адреса

  Ответить  
 
 автор: heed   (02.02.2013 в 19:00)   письмо автору
 
   для: TavRoX   (02.02.2013 в 17:38)
 

я всё равно ничего не пойму, может что-то такое
<xmp>
<?php
$txt 

<img src="../tiny/upload-files/aquarium/img-1.jpg" width="55"/> 
<img width="55" src="http://......com/upload-files/img/aquarium-1.jpg"/> 
<img src="../tiny/upload-files/aquarium/img-1.jpg" width="300"/> 
<img width="300" src="http://......com/upload-files/img/aquarium-1.jpg"/> 

'
;
function 
prc_f($m) {
 return (
$m[2]< 201)? $m[1].'_word_/'.$m[3]: $m[0];
}

// только с двойными кавычками (")
echo $txtpreg_replace_callback('#(<img\s(?=[^>]*\bwidth="(\d+)")[^>]*?\bsrc="(?:[^"/>]*/)+)' 
        
.'([^">]*")#i''prc_f'$txt);
а может и нет необходимости вставлять это (?=.....) а можно просто вставить width="(\d+)" по другому

  Ответить  
 
 автор: TavRoX   (02.02.2013 в 19:46)   письмо автору
 
   для: heed   (02.02.2013 в 19:00)
 

неее смотри, я незнаю ни высоту ни ширину, мне просто нужно сделат ьсперва
это
<?php
$txt 
'
<img src="../tiny/upload-files/aquarium/img-1.jpg"/>
<img alt="alt" src="http://......com/upload-files/img/aquarium-1.jpg"/>
'
;
echo 
$txtpreg_replace('#(<img[^>]+?\bsrc=["\'](?:[^"\'/>]*/)+)'
        
.'([^"\'>]*["\'])#i''$1_word_/$2'$txt);

а затем у картинок у которых width> 200 нужно _word_/ убрать

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования