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

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

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

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

Кто знает, помогите пжлст.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
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
13208 / 6597 / 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
13208 / 6597 / 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
13208 / 6597 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
11.05.2010, 16:02 6
Лучший ответ Сообщение было отмечено Kerry_Jr как решение

Решение

О, дак вот же:
PHP
1
$pattern = "/>[^<]*?" . $words[$i] . "[^<]*?</i";
Вместо точки [^<] - любые символы кроме < .
0
11.05.2010, 16:02
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.05.2010, 16:02
Помогаю со студенческими работами здесь

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

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

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

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


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

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

Новые блоги и статьи
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетных компьютеров началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
Как определить, содержит ли строка подстроку в JavaScript
InfoMaster 19.01.2025
При разработке веб-приложений часто возникает необходимость выполнять различные операции со строками, среди которых особое место занимает поиск подстрок. JavaScript предоставляет несколько встроенных. . .
Что такое метаклассы в Python
InfoMaster 19.01.2025
Метаклассы в Python представляют собой один из самых мощных и одновременно сложных механизмов языка, позволяющий программистам контролировать процесс создания классов. По своей сути, метакласс. . .
Как удалить свойство из объекта JavaScript
InfoMaster 19.01.2025
В современной веб-разработке объекты JavaScript играют фундаментальную роль в организации и структурировании данных. Они представляют собой контейнеры, которые хранят связанные данные и. . .
Какая разница между String и string в C#
InfoMaster 19.01.2025
В языке программирования C# существует интересная особенность: для работы со строками можно использовать как String, так и string. Эта двойственность часто вызывает вопросы у разработчиков, особенно. . .
Как в Git откатить репозиторий к предыдущему коммиту
InfoMaster 19.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса, предоставляя разработчикам мощные инструменты для управления изменениями в. . .
Как работают замыкания (closure) в JavaScript
InfoMaster 19.01.2025
В мире современной веб-разработки замыкания (closures) представляют собой один из фундаментальных концептов языка JavaScript, который часто вызывает затруднения у начинающих разработчиков, но при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru