Xpoint
   [напомнить пароль]

preg_replace для URL адреса

Метки: [без меток]
[удл]
2010-01-29 21:15:55 [обр] Mobik[досье]

Зашел в тупик с проблемой переделки адресов на лету для нового сайта из старой БД... Перелопатить 15 тыс адресов не возможно т.к. новости будут на двух разных сайтах, с разной структурой
Код на котором застопорился

$dig='
Новости <a href="/news/israel/">Израиля</a>
<br>bla bla
<br> Новости<a href="/news/russia/">России</a>,
<br> и Новости <a href="/news/russia/moscow/">Москвы</a>,
<br> а может Новости <a href="/news/russia/moscow/sheremetyevo/">Шереметьева</a> ну и
<br> <a href="/news/russia/moscow/sheremetyevo/news123/">Новость 123</a>
';

/*
Нужно получить текст HTML:

Новости <a href="http://israel.ojo.com.ua/">Израиля</a>
<br>bla bla
<br> Новости<a href="http://russia.ojo.com.ua/">России</a>,
<br> и Новости <a href="http://russia.ojo.com.ua/moscow.htm">Москвы</a>,
<br> а может Новости <a href="http://russia.ojo.com.ua/moscow-sheremetyevo.htm">Шереметьева</a> ну и
<br> <a href="http://russia.ojo.com.ua/moscow-sheremetyevo-news123.htm">Новость 123</a>

Пытался по разному, последний вариант:
*/

if(eregi('\/news\/',$dig)){

$dig=preg_replace('#<a href="/news/(.+?)/(.+?)/(.+?)/(.+?)/">(.+?)</a>#msi'
,'<a href="http://\\1.ojo.com.ua/\\2-\\3-\\4.htm">\\5</a>',$dig);

$dig=preg_replace('#<a href="/news/(.+?)/(.+?)/(.+?)/">(.+?)</a>#msi'
,'<a href="http://\\1.ojo.com.ua/\\2-\\3.htm">\\4</a>',$dig);

$dig=preg_replace('#<a href="/news/(.+?)/(.+?)/">(.+?)</a>#msi'
,'<a href="http://\\1.ojo.com.ua/\\2.htm">\\3</a>',$dig);

}
echo $dig;

Спасибо за помощь.

спустя 1 час 9 минут [обр] Mobik[досье]
Дополнение, адрес может быть, любой длины:
/news/russia/ или
/news/russia/moscow/sheremetyevo/
и состоять из символов "-" и цифр
спустя 2 часа 48 минут [обр] Алексей Севрюков(162/1280)[досье]

Mobik[досье] Код на Perl но смысл понятен:

# разрезаем строку по "/", и помещаем результат в массив
my @arr=split(/\//, $str);

# новый урл очень простой, в конце склека элементов массив со второго по последний
my $url="http://$arr[1].ojo.com.ua/". join ("-", @arr[2-$#arr] );

split - explode, join - implode.
P.S. Делать лучше в два этапа, первый этам - отлов самих ссылок (тут проблем нет, href="([^"]+)"), второй этап замена содержимого вызовом функции, которая переделывает URL (в примере).

спустя 17 часов [обр] Mobik[досье]

Спасибо за помощь.
Идею понял, намутил, отдельно работает:

$w='ukraine/crimea/yalta/hotel_five';
$a_ma=explode('/',$w);
//echo sizeof($a_ma);
$w='http://'.$a_ma[0].'.ojo.com.ua/';
unset($a_ma[0]);
if(sizeof($a_ma)>0){
$w.=implode('-',$a_ma).'.htm';
}
echo $w;

С функцией не работает:

$dig='
Новости <a href="/news/israel/">Израиля</a> <br>bla bla
<br> Новости<a href="/news/russia/">России</a>,
<br> и Новости <a href="/news/russia/moscow/">Москвы</a>,
<br> а может Новости <a href="/news/russia/moscow/sheremetyevo/">Шереметьева</a> ну и
<br> <a href="/news/russia/moscow/sheremetyevo/news123/">Новость 123</a>
';

function s_replace($w){

$a_ma=explode('/',$w);
//echo sizeof($a_ma);
$ww='http://'.$a_ma[0].'.ojo.com.ua/';
unset($a_ma[0]);
$ww.=implode('-',$a_ma).'.htm';

unset($a_ma);
return $ww;
}

echo $dig=preg_replace('#<a href="\/news\/(.+?)\/\"\>(.+?)\<\/a\>#msi'
,"<a href=\"".s_replace('$1')."\">$2</a>",$dig);

или я ослеп, или...
В функции explode не срабатывает из preg_replace
если вызываем отдельно,

echo s_replace('israel/eilat/raddisson_hotel');

 то работает.
Может как-то по другому нужно?

спустя 4 дня [обр] Mobik[досье]
сообщение промодерировано
Проблема решена...
function s_replace($w){
$a_ma=explode("/",$w);
$ww='http://'.$a_ma[0].'.ojo.com.ua/';
unset($a_ma[0]);
$ww.=implode('-',$a_ma).'.htm';
return $ww;
}

$dig = 'as sdf as df <a href="/news/turkey/kemer/">sasdfasdfas asdfas</a>  asfasg asfg asf';
$dig = preg_replace( '#<a href="\/news\/(.+?)\/\"\>(.+?)<\/a>#msie', "'<a href=\"'.s_replace( '\\1' ).'\">\\2</a>';", $dig );
echo $dig;
Powered by POEM™ Engine Copyright © 2002-2005