0 / 0 / 0
Регистрация: 09.05.2010
Сообщений: 6
1

Жадность регулярного выражения

10.05.2010, 16:20. Показов 8038. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Вот пишу лабу, и никак не пойму, в чем проблема.
Код:
PHP
1
2
3
4
    $pattern = "/>.*?" . $words[$i] . ".*?</";
    preg_match_all($pattern, $page, $matches);
 
    print_r($matches);
"Не жадный" почемуто только второй .*?, после того как встречает открывающуюся скобку тега, останавливаеться, а первый .*? захватывает все остальное, пока не увидит ">&raquo;". Мне не понятно, почему он не останавливаеться при первой увиденной >, и почему останавливаеться тут ">&raquo;".

Кто знает, помогите пжлст.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.05.2010, 16:20
Ответы с готовыми решениями:

Написание регулярного выражения
// /(+)/ Друзья,что значат эти выражения,подскажите пожалуйста? Друзья,так же подскажите ...

Разбор регулярного выражения
Здравствуйте. Проблема такая: пытаюсь зарегистрироваться на китайском сайте, номер телефона не...

Составление регулярного выражения
Привет. Есть теги {group=8}Какой то текст{/group} Они разумеется в tpl файле который достаётся...

Формат регулярного выражения
$text = preg_replace('!\b({1,3})\b!u', '&lt;strong&gt;&lt;span style=&quot;color:red&quot;&gt;\\0&lt;/span&gt;&lt;/strong&gt;',...

5
13207 / 6595 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.05.2010, 17:00 2
Что у Вас в $words[$i] ? Может, там спецсимволы незаэкранированы?
0
0 / 0 / 0
Регистрация: 09.05.2010
Сообщений: 6
10.05.2010, 17:05  [ТС] 3
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Что у Вас в $words[$i] ? Может, там спецсимволы незаэкранированы?
Нет, там точно не никаких левых символов.

Приведу пример:
Если задать страничку для поиска "http:\\hackua.com" и поисковое слово "Хак":
PHP
1
2
3
4
5
6
7
8
$url = "http://hackua.com";
 
if($page = getPage($url))
{
    //getLinks($page, $url);
    echo "here are results: ";
    echo searchPage($page, "Хак");
}
, то вывод будет следующим:

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=cp1251"> 
        <title></title> 
    </head> 
    <body> 
 
here are results: Array
(
    [0] => Array
        (
            [0] => >&raquo; <a href="http://uasc.org.ua">UASC</a></div><div class="smallfont">&raquo; <a href="http://websecurity.com.ua">Websecurity</a></div><div class="smallfont">&raquo; <a href="http://proxy.vvs777.org.ua">Безкоштовні проксі</a></div><div class="smallfont">&raquo; <a href="http://linux.pl.ua">Linux users</a></div><div class="smallfont">&raquo; <a href="http://mrthe.name/">Блог mr.The</a></div><div class="smallfont">&raquo; <a href="http://mobize.ru/">Мобільний портал</a></div><div class="smallfont">&raquo; <a href="http://Hack-World.org">Hack-World</a></div><div class="smallfont">&raquo; <a href="http://ua-hack.com">Комп`ютерний маг</a></div><div class="smallfont">&raquo; <a href="http://androids.dp.ua/">Android блог</a></div><div class="smallfont">&raquo; <a href="http://hackzona.com.ua/">HackZona - Територія Злому</a></div><div class="smallfont">&raquo; <a href="http://hackwiki.org/">Словник Хак Термінів<
        )
 
)
1
    </body> 
</html>
По идее он должен останавливаться перед "С", а останавливаеться тут ">&raquo;".

Наверно не совсем понятно, откуда взялся words, напишу краткое определение функции:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function searchPage($page, $text)
{
 
    $words = explode(" ", $text);
 
    $matches_ctr = 0;
 
    for($i = 0; $i < count($words); $i++){
 
    $pattern = "/>.*?" . $words[$i] . ".*?</";
    preg_match_all($pattern, $page, $matches);
 
    print_r($matches);
 
    $matches_ctr += count($matches[0]);
    
    }    
    return $matches_ctr;
}
0
13207 / 6595 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
10.05.2010, 17:18 4
Добавьте модификаторы s и i :
PHP
1
$pattern = "/>.*?" . $words[$i] . ".*?</is";
Или, может, дело в кодировках?
0
0 / 0 / 0
Регистрация: 09.05.2010
Сообщений: 6
10.05.2010, 20:35  [ТС] 5
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Добавьте модификаторы s и i :
PHP
1
$pattern = "/>.*?" . $words[$i] . ".*?</is";
Или, может, дело в кодировках?
Теперь он вообще всю страницу находит, и нигде не останавливаеться. Кодировка cp1251.
0
13207 / 6595 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
11.05.2010, 16:02 6
Лучший ответ Сообщение было отмечено Kerry_Jr как решение

Решение

О, дак вот же:
PHP
1
$pattern = "/>[^<]*?" . $words[$i] . "[^<]*?</i";
Вместо точки [^<] - любые символы кроме < .
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2010, 16:02
Помогаю со студенческими работами здесь

Понимание регулярного выражения
Добрый день ув. пользователи! Подскажите пожалуйста, что значит эта запись. ...

Написание своего регулярного выражения
Здравствуйте! Подскажите, пожалуйста, как написать регулярное выражение. Оно должно делать...

Проверить правильность регулярного выражения
Привет всем. В тексте есть строки типа: ...

Ошибка составления регулярного выражения
Господа, делаю парсинг ВК, получаю страницу нужно вытащить. Строку (оповещение о том во сколько...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru