|
|
|
| ребят в общем такая делема в регулярках я по прежнему дуб дубом но вот такая задача стоит
в тексте есть и картинки и различные виде ос ютуба
вобщем нужно что бы у картинок менялся урл
Было:
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
как єто осуществить? кто может сделать регулярку буду очень благодарен, и если пояснит ьчт ок чему также буду благодарен | |
|
|
|
|
|
|
|
для: TavRoX
(01.02.2013 в 20:26)
| | это ../tiny/upload-files/aquarium/mcith/aquarium-1.jpg в html-коде , в ссылке или в картинке , в каком теге ?
, если без разницы где менять, то str_replace('/aquarium/', '/aquarium/mcith/', $txt); | |
|
|
|
|
|
|
|
для: heed
(02.02.2013 в 02:38)
| | только в картинке
и тут прикол что слово aquarium это так для примера, оно будет менятся всегда | |
|
|
|
|
|
|
|
для: 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 $txt= preg_replace('#(<img[^>]+?\bsrc=["\'](?:[^"\'/>]*/)+)'
.'([^"\'>]*["\'])#i', '$1_word_/$2', $txt);
| если заменяет и там где не надо, то нужны какие-то отличительные признаки, может upload-files/ обязательно должно присутствовать, или ещё чего, там где [^"\'/>]*
, или не там | |
|
|
|
|
|
|
|
для: heed
(02.02.2013 в 13:23)
| | попробую отпишусь. спасибо заранее) | |
|
|
|
|
|
|
|
для: heed
(02.02.2013 в 13:23)
| | бомба!!!! спасибо пашет) | |
|
|
|
|
|
|
|
для: heed
(02.02.2013 в 13:23)
| | а можно еще добавить такой параметр, который будет отсеивать картинки с шириной меньше заданного размера? | |
|
|
|
|
|
|
|
для: 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='
нафига тогда я буду каждый раз городить огороды этих ненужных вариантов, даже если они поддерживабтся какими-то стандартами. | |
|
|
|
|
|
|
|
для: heed
(02.02.2013 в 16:50)
| | с атрибутом ширины все картинки, но только изменения нужно делать с теми у кого ширина меньше 201 пикселя.
или же по другому, после всего этого, провести еще одну операцию с текстом выбрать все картинки у которых ширина больше 200 и убрать оттуда слово mcith/ | |
|
|
|
|
|
|
|
для: TavRoX
(02.02.2013 в 16:54)
| | если width= обязательно до, или обязательно после src=, то одним выражением не намного сложнее. если по разному то возможно второй вариант. | |
|
|
|
|
|
|
|
для: TavRoX
(02.02.2013 в 13:50)
| | иногда проще весь текст пройти парой шаблонов попроще, чем один раз чем-то навороченым
// upd
дольше 4х минут подбирал слова :) | |
|
|
|
|
|
|
|
для: heed
(02.02.2013 в 17:02)
| | думаю сделать так
тот первый вариант который был делается, а затем после него какой то вариант с отсевом картинок с шириной больше 200 после срч что бы убирал слово mcith/ из адреса | |
|
|
|
|
|
|
|
для: 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 $txt= preg_replace_callback('#(<img\s(?=[^>]*\bwidth="(\d+)")[^>]*?\bsrc="(?:[^"/>]*/)+)'
.'([^">]*")#i', 'prc_f', $txt);
| а может и нет необходимости вставлять это (?=.....) а можно просто вставить width="(\d+)" по другому | |
|
|
|
|
|
|
|
для: 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 $txt= preg_replace('#(<img[^>]+?\bsrc=["\'](?:[^"\'/>]*/)+)'
.'([^"\'>]*["\'])#i', '$1_word_/$2', $txt);
|
а затем у картинок у которых width> 200 нужно _word_/ убрать | |
|
|
|