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
ага спасибки еще раз!
счас на большом количестве прогоню - посмотрю - если будут сбои попробую видоизменить...
п.с. а я надо сказать по незнанию думал, что для того, что бы указать произвольную последовательность символов нужно обязательно прописывать .*?
цитата
15/04/09 в 13:03
Some Milk
Lamagro писал:
п.с. а я надо сказать по незнанию думал, что для того, что бы указать произвольную последовательность символов нужно обязательно прописывать .*?
.*? или .+? - это таки произвольная последовательность, но нежадная. Жадная - просто .* или .+
Я правда думал что в пхп по умолчанию синтаксис .*? не работает вообще, и можно задавать жадность только на уровне всего регекса. Оказалось работает.
цитата
15/04/09 в 13:14
Lamagro
ну еще раз биг сенкс - надо матчасть учить
цитата
15/04/09 в 13:17
Lamagro
как самоучке местами понимания/знания не хватает
цитата
17/05/09 в 10:39
ToLiK_KGB
2ts стукни плз не могу до тебя достучаться
цитата
17/05/09 в 21:16
Dr.Syshalt
В
топике рядом
приводил регексп для URLа
Новая тема
Ответить
Эта страница в полной версии