Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения PCRE и жадность, Выделение минимальной подстроки 
:(
    Опции темы
harper
Дата 6.11.2006, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.5.2006

Репутация: нет
Всего: нет



Есть строка вида

<a href="docs.zip">Документы</a><a href="note.zip">Заметки</a>

регулярному выражению <a href="(.*)?">Заметки<\/a> (подмаске) соответствует строка

docs.zip">Документы</a><a href="note.zip

URL

однако хотелось бы увидеть результатом 
note.zip
т. к. она в принципе тоже удоволетворяет данному выше регулярному выражению, но выбор соответсвующей подмаске подстроки производится видимо нахождением первого совпадения, а не минимального (изменение "жадности" не помогает).

PM MAIL   Вверх
Eugene_Bond
Дата 6.11.2006, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 3.9.2006

Репутация: 1
Всего: 4



1. Жадность лечится так: (.*) (.*?)
2. Лучше сделать (.*)? ([^"]+)
PM MAIL   Вверх
harper
Дата 6.11.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.5.2006

Репутация: нет
Всего: нет



Цитата(Eugene_Bond @  6.11.2006,  08:47 Найти цитируемый пост)
1. Жадность лечится так: (.*) (.*?)

может жадность и лечится, но задача от этого не решается, возможно жадность здесь и вовсе не причём


Цитата(Eugene_Bond @  6.11.2006,  08:47 Найти цитируемый пост)
2. Лучше сделать (.*)? ([^"]+)

такой вариант не устраивает, должно быть именно (.*)

PM MAIL   Вверх
skifoz
Дата 6.11.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 23.1.2006
Где: Россия

Репутация: нет
Всего: 1



вот так ищеца href
Код


$text ='<a href="docs.zip">Документы</a><a href="note.zip">Заметки</a>';

if(preg_match_all('/a\shref="(.*?)">/mix', $text, $find)) {
    print_r($find[1]);
}


PM MAIL WWW   Вверх
harper
Дата 6.11.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.5.2006

Репутация: нет
Всего: нет



skifoz, специфика задачи такая что эти ссылки могут быть как похожи так и не похожи (и не обязательно что там будут ссылки вообще), поэтому такой вариант не подходит, но что интересно, в предложенном вами коде при исключении ? влияние жадности ощутимо, для кода

Код

<?
$text ='<a href="docs.zip">Документы</a><a href="note.zip">Заметки</a>';

if(preg_match_all('|a href="(.*?)">Заметки</a>|', $text, $find)) {
    print_r($find[1]);
}
?>


такого влияния не наблюдается, хотя вроде бы должно
PM MAIL   Вверх
Eugene_Bond
Дата 6.11.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 3.9.2006

Репутация: 1
Всего: 4



Цитата(harper @  6.11.2006,  10:41 Найти цитируемый пост)
такой вариант не устраивает, должно быть именно (.*)

Не вижу ни одной причины почему не [^"]+
Даже если учесть, что html может быть кривым и атрибут href будет окружен одиночными кавычками или вообще без кавычек, то вариант с ".*" все равно менее правильный.
А в теле URL кавычки быть в принципе не может

Добавлено @ 15:57 
1. Кстати, если искать именно a href="(.*?)">Заметки</a> то как раз жадность может и помочь:

preg_match_all('|.*a href="(.*?)">Заметки</a>|', $text, $find)

2. А зачем preg_match_all ? ссылок на заметки может быть много?
PM MAIL   Вверх
harper
Дата 6.11.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 29.5.2006

Репутация: нет
Всего: нет



Цитата(Eugene_Bond @  6.11.2006,  15:54 Найти цитируемый пост)
Не вижу ни одной причины почему не [^"]+


потому что это лишь локальная задача, глобальная - выборка данных из текста по некоторому шаблону, который не является шаблоном в формате PCRE, но в последствии приводится к нему в несколько этапов

Цитата(Eugene_Bond @  6.11.2006,  15:54 Найти цитируемый пост)

preg_match_all('|.*a href="(.*?)">Заметки</a>|', $text, $find)


огромное спасибо, .* в начале упустил


Цитата(Eugene_Bond @  6.11.2006,  15:54 Найти цитируемый пост)
А зачем preg_match_all ?

удобно, так и не объяснишь почему, но удобно
PM MAIL   Вверх
CyClon
Дата 7.11.2006, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 1
Всего: 4



Юзайте preg_match('#...#isU', $string);

Именно модификатор U отвечает за жадность.

Добавлено @ 15:31 
Код
(.*?)


Здесь используем эквивалент

Код
(.+)


Цитата
preg_match_all


Находит ВСЕ вхождения строки, в отличии от preg_match (Находит одно, первое-попавшееся вхождение строки).


--------------------
user posted image
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0595 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.