Консультация № 143761
12.09.2008, 19:27
0.00 руб.
0 2 0
Здравствуйте!
Подскажите пожалуйста как решить следующую задачу (php, preg_replace).
Есть некий набор урлов (приложение 1)
Как с помощью регексов поставить ./f.php? перед http:// у урла, в котором есть текст replace.ru или replace2.ru, т.е. получить приложение 2, а у которых нет ранее упомянутого текста убрать все до http%3a (получить приложение 3)?
И можно-ли это сделать одним регексом?



Приложение:
1. Исходный набор ссылок
http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2fsite2.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2freplace.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2fsite3.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2freplace2.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2anothersite.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2anothersite.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2freplace.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2fsite4.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf


2. Урлы с добавленным ./f.php?
./f.php?http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2freplace.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
./f.php?http://sait/folder/page?.i=a&b=bb&url=http%3a%2f%2freplace2.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf


3. Урлы без нужного текста
http%3a%2f%2fsite2.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http%3a%2f%2fsite3.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http%3a%2f%2anothersite.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http%3a%2f%2anothersite.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf
http%3a%2f%2fsite4.ru%2ffile%2ffile%3b_ylt%3dA0WTcZFqQMpIDDsBqwzpy6IX%3b_ylv%3d3%3fqid%3d20080912030502AARPZaf

Обсуждение

Неизвестный
13.09.2008, 10:23
общий
А что у вас вызывает затруднения?
Задача достаточно тривиальная
Теоретически сделать это одним регэкспом можно, но вряд ли это будет проще. Лучше разбить задачу на 2 части.
1. Ищем совпадение с replace.ru или replace2.ru
Код:
  [b] replace\.ru|replace2\.ru [/b]  
, если оно есть то делаем контактацию строк, если нет совпадения - переходим к п.2
2. Удаляем часть сторки начинающуюся с http и до следующего http.
Код:
  [i] ^(http[-a-z0-9_&?=+,.!/~*'%]*)http/i [/i]  

Вуаля.
PS за абсолютную точность регэкспов( последнего) не ручаюсь. Возможно в php не будет работать ибо реализация механизма регулярных выражений там уж очень "убогая" и может потребоваться модификация
Неизвестный
13.09.2008, 10:50
общий
Спасибо!
С первым разобрался.
Однако со вторым не понял...
Пытаюсь выполнить вторую задачу так:
Код:
echo preg_replace("/(?<!f\.php)\?http:\/\/.*url\=(http.*?<)/",rawurldecode("\\1"),$txt);

Но таким регексом почему-то не получается.
Форма ответа