[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсинг
turbomax
Добрый день ,У самого с парсингом плохо и возник вопрос

на вход подается строка вида 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() конечно интересное решение, но твой вариант не намного менее мазо
у меня просто полная версия кода, а у тебя только часть

Спустя 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

Спустя 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".

Цитата (walerus @ 16.08.2011 - 14:25)
А почему никто не использовал parse_url ?

Потому что не вспомнили, мб?

laugh.gif

Спустя 20 секунд (16.08.2011 - 13:32) Invis1ble написал(а):
walerus
И в чем смысл - парсить, а потом разбивать explode() то что криво распарсилось parse_url() ? 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

Спустя 4 минуты, 57 секунд (16.08.2011 - 13:47) Invis1ble написал(а):
neadekvat
Причем здесь "объединять"? Я в курсе, что есть что из них 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


Цитата
А я тут подумал - может, это автор ЧПУ делает, и просто не то значеие из _SERVER достает?
- об этом история ТС умалчивает )))

Спустя 2 минуты, 58 секунд (16.08.2011 - 13:59) neadekvat написал(а):
Цитата (Invis1ble @ 16.08.2011 - 14:55)
На корректной работе ведь это не отразится, не правда ли?

Да, наши регулярки делают абсолютно то же самое (в плане результата). Правда, у меня она проще smile.gif





Спустя 31 секунда neadekvat написал(а):
Цитата (walerus @ 16.08.2011 - 14:56)
ТС не хочет регулярки

Это тоже хороший вопрос - почему нет?

Спустя 1 минута, 28 секунд (16.08.2011 - 14:00) Invis1ble написал(а):
walerus
ТС конкретно написал 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

Спустя 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
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.