Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Жадные модификаторы
 
 автор: Максимыч   (22.09.2006 в 13:50)   письмо автору
 
 

Что значит "жадные модификаторы"? Объясните пожалуйста доступно и с примером. Никак не могу въехать :-(

   
 
 автор: kasmanaft   (22.09.2006 в 16:35)   письмо автору
 
   для: Максимыч   (22.09.2006 в 13:50)
 

Попрбую :)
По умолчанию рег. выражения работают в "жадном" режиме, т.е:
допустим у нас есть строка "abcdef", ее можно описать рег. выр-ем "[\w]+", без модификатора жадности, жадный php заберет всю строку ...

а если же сделать выражение не жадным, то попадет только первая буква ( + - обязательно должна быть хотя бы одна буква ... стояла бы звездочка *, под выражение не попало бы ничего)

<?
$text 
'abcdefg';
preg_match ("/([\w]+)/"$text$regs);
echo 
$regs[1]."<br>";
$text 'abcdefg';
preg_match ("/([\w]+?)/"$text$regs);
echo 
$regs[1]."<br>";
$text 'abcdefg';
preg_match ("/([\w]+)/U"$text$regs);
echo 
$regs[1];
?>

   
 
 автор: Максимыч   (22.09.2006 в 16:51)   письмо автору
 
   для: kasmanaft   (22.09.2006 в 16:35)
 

А зачем это нужно? Не проще ли было вместо:

<?php 
$text 
'abcdefg'
preg_match ("/([\w]+?)/"$text$regs); 
echo 
$regs[1]."<br>"
или 
$text 
'abcdefg'
preg_match ("/([\w]+)/U"$text$regs); 
echo 
$regs[1]; 
?> 

Написать preg_match ("/([A-z])/", $text, $regs). Зачем придумана эта "жадность"?

   
 
 автор: kasmanaft   (22.09.2006 в 18:48)   письмо автору
 
   для: Максимыч   (22.09.2006 в 16:51)
 

Даже не знаю какой бы пример привести, чтобы и понятно было и без модификатора етого не обойтись :)

Кое-что сочинил ... надеюсь разберешься :)
Допустим, есть у нас текст, написанный со злым умыслом каким-то нехорошим человеком ... который не хотел, чтоб мы ограббили этот текст. Напутал он там всего, простым выражением не справиться.
Нам надо выдрать обе value из его кода. Здесь без модификатора уже будет сложно что-нибудь придумать.

<?php
$text 
'<input style="bla-bla:bla" value="value1" value="value2" name=name>
         <input  value="value1" style=bla-bla:bla name="<name>" value="value2">
         <input       value="value1" name=name style="bla-bla:bla" value="value2">'
;
preg_match_all ('/<input[\s]+.*value="(.*)".*value="(.*)".*>/isU'$text$regs);
echo 
'<pre>';
print_r ($regs[1]).'<br>';
print_r ($regs[2]);
?>

   
 
 автор: cheops   (22.09.2006 в 19:53)   письмо автору
 
   для: Максимыч   (22.09.2006 в 13:50)
 

По умолчанию регулярные выражения не жадные, т.е. ищется масимально длинное соответвие, т.е. если у вас имеется регулярное выржение
<table>(.*)</table>
то будет исаться не первый тэг </table>, а начиная с конца файл, т.е. последний который только можно найти. В результате соответствие (.*) будет содержать все </table> которые только имеются в файле, окромя последнего. Модификатор U позволяет сделать регулярное выражение жадным, т.е. искать минимальное соответствие регулярному выражению. U действует на всё регулярное выражение, конструкции .*? и .+? действуют локально.

   
 
 автор: kasmanaft   (22.09.2006 в 20:52)   письмо автору
 
   для: cheops   (22.09.2006 в 19:53)
 

Слышал раньше от вас, что "По умолчанию регулярные выражения не жадные" ... но тогда подумалось, что это описка ... ради интереса, почему они "не жадные", если ведут себя, как жадные? лишь бы побольше захапать =))
или на что они "не жадные" ?

   
 
 автор: cheops   (22.09.2006 в 21:11)   письмо автору
 
   для: kasmanaft   (22.09.2006 в 20:52)
 

Это я ошибся... конечно, же регулярные выражения по умолчанию жадные... Термин больно уж не однозначный, регулярные выражения могут жадничать захватывая больше символов и жадничать захватывая меньше символов...

   
 
 автор: Максимыч   (25.09.2006 в 10:54)   письмо автору
 
   для: cheops   (22.09.2006 в 21:11)
 

Всё понял. Спасибо что описали на пальцах.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования