Как-то раз в ходе разработки парсера одного сервиса столкнулся с довольно извращенной задачей обработки URL'ов на странице.
Итак, имеется некоторая переменная, содержащая ряд URL-адресов вида
$urls = "
http://site.ru/?url=http://othersite1.ru/some_page.htm
http://site.ru/?url=http://othersite2.ru/some_page.htm
http://site.ru/?url=http://othersite3.ru/some_page.htm
";
Программа-максимум:
1. Заменить у URLов, содержащих текст othersite1.ru или othersite2.ru http://site.ru/?url= на goto.php?
2. У URLов, не подошедших под первое условие оставить только то, что идет после url=
Решить задачу применением нескольких регулярных выражений, конечно, легко:
$urls=preg_replace("/http:\/\/(.*?(othersite1|othersite2)\.ru.*?\r\n)/","./goto.php?http://\\1",$urls);
$urls=preg_replace("/http:\/\/site\.ru.*?\r\n)/","",$urls);
Но неплохо-бы выполнить это все одним выражением.
Товарищ DECIDE предложил следующее решение:
$replaces="othersite1|othersite2";
$urls=preg_replace("/http(.*?)((&url=.*?($replaces))|&url=)(.*?)\r\n/e","('\\2'!='&url='?'./goto.php?http\\1\\2\\5':'\\5').'\r\n'",$urls);
echo str_replace("\r\n","<br>",$urls);
Как-бы не выглядело сие чудо, работает оно как часы!
Остались вопросы? Задавайте, не задавайте, а как работает это выражение я сам не понимаю...
|
|
Webmoney Z163628999150, R617151845974
|