на вход подается строка вида site.ru/2/1 или www.site.ru/2/1 или http://site.ru/2/1
Задача : если строка соответствует какому либо из видов вытащить из нее параметры 1 и 2
Решение необходимо без регулярок
Спустя 16 минут, 28 секунд (16.08.2011 - 12:00) Invis1ble написал(а):
можно примерно так
Как видно, без регулярок получается садо-мазо
$data = array('site.ru', 'www.site.ru', 'http:site.ru');
$url = 'http://site.ru/2/1';
$items = explode('/', $url);
if (in_array(implode('', array_slice($items, 0, -2)), $data))
$components = array_slice($items, -2);
else
$components = array();
Как видно, без регулярок получается садо-мазо
Спустя 10 минут, 9 секунд (16.08.2011 - 12:10) neadekvat написал(а):
Invis1ble, да, у тебя и правда какие-то извращения. Можно упростить:
$url = 'http://site.ru/2/1';
$url = trim($url, 'htp:/');
$items = explode('/', $url);
print_r($items); // Array ( [0] => site.ru [1] => 2 [2] => 1 )
Спустя 16 минут, 7 секунд (16.08.2011 - 12:26) Invis1ble написал(а):
neadekvat
да, с trim() конечно интересное решение, но твой вариант не намного менее мазо
у меня просто полная версия кода, а у тебя только часть
да, с trim() конечно интересное решение, но твой вариант не намного менее мазо
у меня просто полная версия кода, а у тебя только часть
Спустя 47 минут, 1 секунда (16.08.2011 - 13:13) neadekvat написал(а):
Цитата (Invis1ble @ 16.08.2011 - 13:26) |
да, с trim() конечно интересное решение |
Вообще, лучше, конечно, str_replace, потому что в определенных ситуациях он может обрезать лишнее, по-моему.
А регулярка, кстати, тоже будет не самая простая. Хотя, в целом, обычной сложности, но все равно, когда урлы в регулярку суешь - как-то много букоф получается.
Спустя 5 минут, 46 секунд (16.08.2011 - 13:19) Invis1ble написал(а):
Регулярка как регулярка, очень даже простая
#^(?:http://|www\.)?site.ru/(.*)/(.*)$#U
#^(?:http://|www\.)?site.ru/(.*)/(.*)$#U
Спустя 5 минут, 57 секунд (16.08.2011 - 13:25) walerus написал(а):
А почему никто не использовал parse_url ?
$data = 'site.ru/2/1';
$data_1 = 'www.site.ru/2/1';
$data_2 = 'http://site.ru/2/1';
function getParametrs( $data )
{
$result = parse_url($data);
$result = explode( "/", $result['path'] );
unset($result[0]);
return array_values( $result );
}
print_r( getParametrs( $data) );
print_r( getParametrs( $data_1 ) );
print_r( getParametrs( $data_2 ) );
/* Результат
(
[0] => 2
[1] => 1
)
Array
(
[0] => 2
[1] => 1
)
Array
(
[0] => 2
[1] => 1
)
*/
Спустя 5 минут, 48 секунд (16.08.2011 - 13:31) neadekvat написал(а):
Invis1ble, контраргумент: входной параметр "http://www.site.ru/1/4".
Цитата (walerus @ 16.08.2011 - 14:25) |
А почему никто не использовал parse_url ? |
Потому что не вспомнили, мб?
Спустя 46 секунд (16.08.2011 - 13:31) walerus написал(а):
Цитата (neadekvat @ 16.08.2011 - 10:31) | ||
Invis1ble, контраргумент: входной параметр "http://www.site.ru/1/4".
Потому что не вспомнили, мб? |
![laugh.gif](http://phpforum.ru/html/emoticons/laugh.gif)
Спустя 20 секунд (16.08.2011 - 13:32) Invis1ble написал(а):
walerus
И в чем смысл - парсить, а потом разбивать explode() то что криво распарсилось parse_url() ?![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
И потом, ты тоже видимо невнимательно прочел - "если строка соответствует какому либо из видов"
Короче все это мегакостыли, в данном случае регулярка - самое то, имхо
Спустя 2 минуты, 41 секунда Invis1ble написал(а):
neadekvat
контрконтраргументы
1. о таком виде url ТС не сказал
2. решение
#^(?:http://(?:www\.)?|www\.)?site.ru/(.*)/(.*)$#U
И в чем смысл - парсить, а потом разбивать explode() то что криво распарсилось parse_url() ?
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
И потом, ты тоже видимо невнимательно прочел - "если строка соответствует какому либо из видов"
Короче все это мегакостыли, в данном случае регулярка - самое то, имхо
Спустя 2 минуты, 41 секунда Invis1ble написал(а):
neadekvat
контрконтраргументы
1. о таком виде url ТС не сказал
2. решение
#^(?:http://(?:www\.)?|www\.)?site.ru/(.*)/(.*)$#U
Спустя 10 минут, 1 секунда (16.08.2011 - 13:42) neadekvat написал(а):
Invis1ble, вот видишь, уже усложняешь) А http:// и www. - это вообще отдельные части, как их можно объединять? Одно - протокол, второе - поддомен.
#^(?:http://)?(?:www\.)?site.ru/(.*)/(.*)$#U
#^(?:http://)?(?:www\.)?site.ru/(.*)/(.*)$#U
Спустя 4 минуты, 57 секунд (16.08.2011 - 13:47) Invis1ble написал(а):
neadekvat
Причем здесь "объединять"? Я в курсе, что есть что из них![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
По регулярке - да, твоя лучше
Все что я пытаюсь донести, так это то, что в данном конкретном случае регулярка как бы наименее костыльный вариант.
Причем здесь "объединять"? Я в курсе, что есть что из них
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
По регулярке - да, твоя лучше
Все что я пытаюсь донести, так это то, что в данном конкретном случае регулярка как бы наименее костыльный вариант.
Спустя 3 минуты, 37 секунд (16.08.2011 - 13:50) neadekvat написал(а):
Цитата (Invis1ble @ 16.08.2011 - 14:47) |
Причем здесь "объединять"? |
Вот здесь:
(?:http://(?:www\.)|
Цитата (Invis1ble @ 16.08.2011 - 14:47) |
Все что я пытаюсь донести, так это то, что в данном конкретном случае регулярка как бы наименее костыльный вариант. |
А я тут подумал - может, это автор ЧПУ делает, и просто не то значеие из _SERVER достает?
Спустя 4 минуты, 14 секунд (16.08.2011 - 13:55) Invis1ble написал(а):
neadekvat
Цитата |
Вот здесь: (?:http://(?:www\.)| |
ну и что, это ведь просто кусок шаблона, хоть и не наиболее оптимально составленный. На корректной работе ведь это не отразится, не правда ли?
Спустя 1 минута, 8 секунд (16.08.2011 - 13:56) walerus написал(а):
Invis1ble, neadekvat правильно привел пример, а если ТС изменит свой URL ?, например не site.ru, а mynewsite.ru будет, тогда регулярка не сработает, согласен parse_url и такое "any_symbols/2/1" примет за урл и разобьет его, нужно тогда сделать сначала строгие правила поиска ТОЛЬКО ссылки, а не любого текста. Такая процедура делалась мной для выборки из миллионов строк в файле, на поиск только урлов...
Цитата |
Все что я пытаюсь донести, так это то, что в данном конкретном случае регулярка как бы наименее костыльный вариант. |
ТС не хочет регулярки
![rolleyes.gif](http://phpforum.ru/html/emoticons/rolleyes.gif)
Цитата |
А я тут подумал - может, это автор ЧПУ делает, и просто не то значеие из _SERVER достает? |
- об этом история ТС умалчивает )))
Спустя 2 минуты, 58 секунд (16.08.2011 - 13:59) neadekvat написал(а):
Цитата (Invis1ble @ 16.08.2011 - 14:55) |
На корректной работе ведь это не отразится, не правда ли? |
Да, наши регулярки делают абсолютно то же самое (в плане результата). Правда, у меня она проще
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 31 секунда neadekvat написал(а):
Цитата (walerus @ 16.08.2011 - 14:56) |
ТС не хочет регулярки |
Это тоже хороший вопрос - почему нет?
Спустя 1 минута, 28 секунд (16.08.2011 - 14:00) Invis1ble написал(а):
walerus
ТС конкретно написал site.ru, и найденные урлы должны соответствовать именно этому шаблону, если он изменит там что-то, то соответственно меняется сама задача.
ТС конкретно написал site.ru, и найденные урлы должны соответствовать именно этому шаблону, если он изменит там что-то, то соответственно меняется сама задача.
Спустя 3 минуты, 47 секунд (16.08.2011 - 14:04) walerus написал(а):
Цитата |
ТС конкрено написал site.ru |
по причине ... например не палиться что он злосный спамер, и отбирает базу урлов спаршеных с выдачи гугли или яхи как вариант, а задача стоит не именно site.ru, а ВИД строки...
Цитата |
на вход подается строка вида site.ru/2/1 или www.site.ru/2/1 или http://site.ru/2/1 Задача : если строка соответствует какому либо из видов вытащить из нее параметры 1 и 2 |
т.е. ЛЮБОЙ из видов урла...
Спустя 5 минут, 44 секунды (16.08.2011 - 14:10) Invis1ble написал(а):
Цитата (walerus @ 16.08.2011 - 14:04) |
ТС конкрено написал site.ru по причине ... например не палиться что он злосный спамер, и отбирает базу урлов спаршеных с выдачи гугли или яхи как вариант, а задача стоит не именно site.ru, а ВИД строки...Цитата на вход подается строка вида site.ru/2/1 или www.site.ru/2/1 или http://site.ru/2/1 Задача : если строка соответствует какому либо из видов вытащить из нее параметры 1 и 2 т.е. ЛЮБОЙ из видов урла... |
лично я воспринял постановку задачи именно как описал выше. Если нужно, чтоб под шаблон подходил любой урл такого вида, то поменять не проблема
#^(?:http://)?(?:www\.)?[\pN\pL]+\.[\pN\pL]+/(.*)/(.*)$#Uiu
Спустя 20 минут, 25 секунд (16.08.2011 - 14:30) walerus написал(а):
Invis1ble - а поясни чисто для моей "библиотеки" - это "[\pN\pL]" что означает ?, чет первый раз такое втыкаю ))
Спустя 4 минуты, 31 секунда (16.08.2011 - 14:35) Invis1ble написал(а):
walerus
\pN - это тоже самое, что и [0-9]
\pL - это все буквы, типа [a-zA-zа-яА-Я]
все это работает с utf-8, т.е. ставим модификатор u
\pN - это тоже самое, что и [0-9]
\pL - это все буквы, типа [a-zA-zа-яА-Я]
все это работает с utf-8, т.е. ставим модификатор u
Спустя 6 минут, 29 секунд (16.08.2011 - 14:41) walerus написал(а):
Зачет ! ), спасибо )
Спустя 58 минут, 57 секунд (16.08.2011 - 15:40) neadekvat написал(а):
Цитата (Invis1ble @ 16.08.2011 - 15:35) |
\pN - это тоже самое, что и [0-9] \pL - это все буквы, типа [a-zA-zа-яА-Я] |
Нехорошо выворобушкиваться.
Для цифер используем \d, а для набора букв - \w (правда, он шире, чем ты описал). Итого:
#^(?:http://)?(?:www\.)?[\w\.]+/(.*)/(.*)$#U
А если там подразумеваются именно цифры, то лучше так и указать:
#^(?:http://)?(?:www\.)?[\w\.]+/(\d+)/(\d+)$#
Спустя 19 минут, 56 секунд (16.08.2011 - 16:00) Invis1ble написал(а):
Цитата |
Нехорошо выворобушкиваться. |
чего-чего?
Спустя 26 минут, 11 секунд (16.08.2011 - 16:26) neadekvat написал(а):
Цитата (Invis1ble @ 16.08.2011 - 17:00) |
чего-чего? |
Не выворобушкивайся - отцензуренная версия предложения использовать распространенные методы и приемы, понятные большинству
![wink.gif](http://phpforum.ru/html/emoticons/wink.gif)