Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Снова регулярка
цитата
14/04/09 в 15:01
 Lamagro
Нужно выдернуть из страницы всё похожее на урл в котором есть знак вопроса.
Сделал вот так - но бывает вместо урла встречается код страницы до знака вопроса. Код:
/http:\/\/(.*?\?.*?)[^\'\"><]*/i

хелп
цитата
14/04/09 в 15:42
 Some Milk
Регексы бывают greedy (жадные) и non-greedy (соответственно нежадные). Жадные захватывают максимум из того, что могут, нежадные - минимум. По умолчанию обычно они жадны, что мы здесь и наблюдаем. Для полного ответа на вопрос желательно знать язык. Мне кажется, или это пхп? Там жадность отключается ключом //U.
цитата
14/04/09 в 15:44
 Some Milk
А, поспешил с ответом. .*? это и есть нежадный, но хз, это расширенный синтаксис, он не везде работает.
цитата
14/04/09 в 15:45
 Lamagro
это пхп
жадность действительно не причем
цитата
14/04/09 в 15:49
 Some Milk

Да, проверил, таки ни при чем. А пример покажи, где захватывается больше чем надо?
цитата
14/04/09 в 16:09
 Lamagro
Код:
http://blabla.com/list">http://babla.com/list</a><br/><br/>blabla <font size=1><a href="mailto:admin ]at[blabla.com?
его захватывает целиком до знака вопроса
цитата
14/04/09 в 16:33
 Some Milk
Я бы написал так:
Код:

    $test = array('http://blabla.com/list">http://bla-bla.com/list?a=b</a><br/><br/>admin ]at[blabla.com?ddd',
        'noturl http://blabla.com/list http://bla-bla.com/list?a=b',
        'noturl http://blabla.com/list http://bla-bla.com/list?a=b notend',
        'noturl http://blabla.com/list http://bla-bla.com/list?a=b notend http://another-url2.com/list?query');

    $re = '/http:\/\/([^\'\"><\s]+\?[^\'\"><\s]*)/is';

    foreach($test as $t)
    {
        print "test: '$t'\n";
        preg_match_all($re, $t, $r);
        foreach($r[1] as $match) print "match: $match\n";
    }


Код:

# ./test.php
test: 'http://blabla.com/list">http://bla-bla.com/list?a=b</a><br/><br/>admin ]at[blabla.com?ddd'
match: bla-bla.com/list?a=b
test: 'noturl http://blabla.com/list http://bla-bla.com/list?a=b'
match: bla-bla.com/list?a=b
test: 'noturl http://blabla.com/list http://bla-bla.com/list?a=b notend'
match: bla-bla.com/list?a=b
test: 'noturl http://blabla.com/list http://bla-bla.com/list?a=b notend http://another-url2.com/list?query'
match: bla-bla.com/list?a=b
match: another-url2.com/list?query
цитата
15/04/09 в 12:39
 Lamagro
Огромное спасибо за помощь. То что доктор прописал.
Если я правильно понял регулярка:
Код:
$re = '/http:\/\/([^\'\"><\s]+\?[^\'\"><\s]*)/is';

Из подобного кода:
Код:
<font color="red">http://www.blabla.com/cgi/action.cgi?id=164</font><br>
.....
">http://blabla.com?id=albalb</a><br/>

выдергивает любую последовательность символов заключенную (в данном случае) между > и < где встерчается знак ? причем берет до первого встречающегося символа в квадратных скобках иначе просто не берет?
цитата
15/04/09 в 12:53
 Some Milk
Ну в общем да. Там могут быть еще какие-то засады правда, мне не очень нравится вот это [^\'\"><\s], лучше все же задавать символы, которые "могут быть", а не которые "не могут", меньше вероятность, что что-то пойдет не так. Можно там жестко прописать что-то вроде [\w\/-]+, короче, надо пробовать.
цитата
15/04/09 в 12:57
 Lamagro
ага спасибки еще раз!
счас на большом количестве прогоню - посмотрю - если будут сбои попробую видоизменить...

п.с. а я надо сказать по незнанию думал, что для того, что бы указать произвольную последовательность символов нужно обязательно прописывать .*? icon_neutral.gif
цитата
15/04/09 в 13:03
 Some Milk
Lamagro писал:

п.с. а я надо сказать по незнанию думал, что для того, что бы указать произвольную последовательность символов нужно обязательно прописывать .*? icon_neutral.gif

.*? или .+? - это таки произвольная последовательность, но нежадная. Жадная - просто .* или .+
Я правда думал что в пхп по умолчанию синтаксис .*? не работает вообще, и можно задавать жадность только на уровне всего регекса. Оказалось работает.
цитата
15/04/09 в 13:14
 Lamagro
icon_wink.gif
ну еще раз биг сенкс - надо матчасть учить icon_smile.gif
цитата
15/04/09 в 13:17
 Lamagro
как самоучке местами понимания/знания не хватает
цитата
17/05/09 в 10:39
 ToLiK_KGB
2ts стукни плз не могу до тебя достучаться
цитата
17/05/09 в 21:16
 Dr.Syshalt
В топике рядом приводил регексп для URLа


Эта страница в полной версии