|
|
|
| Что значит "жадные модификаторы"? Объясните пожалуйста доступно и с примером. Никак не могу въехать :-( | |
|
|
|
|
|
|
|
для: Максимыч
(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];
?>
|
| |
|
|
|
|
|
|
|
для: 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). Зачем придумана эта "жадность"? | |
|
|
|
|
|
|
|
для: Максимыч
(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]);
?>
|
| |
|
|
|
|
|
|
|
для: Максимыч
(22.09.2006 в 13:50)
| | По умолчанию регулярные выражения не жадные, т.е. ищется масимально длинное соответвие, т.е. если у вас имеется регулярное выржение
<table>(.*)</table>
то будет исаться не первый тэг </table>, а начиная с конца файл, т.е. последний который только можно найти. В результате соответствие (.*) будет содержать все </table> которые только имеются в файле, окромя последнего. Модификатор U позволяет сделать регулярное выражение жадным, т.е. искать минимальное соответствие регулярному выражению. U действует на всё регулярное выражение, конструкции .*? и .+? действуют локально. | |
|
|
|
|
|
|
|
для: cheops
(22.09.2006 в 19:53)
| | Слышал раньше от вас, что "По умолчанию регулярные выражения не жадные" ... но тогда подумалось, что это описка ... ради интереса, почему они "не жадные", если ведут себя, как жадные? лишь бы побольше захапать =))
или на что они "не жадные" ? | |
|
|
|
|
|
|
|
для: kasmanaft
(22.09.2006 в 20:52)
| | Это я ошибся... конечно, же регулярные выражения по умолчанию жадные... Термин больно уж не однозначный, регулярные выражения могут жадничать захватывая больше символов и жадничать захватывая меньше символов... | |
|
|
|
|
|
|
|
для: cheops
(22.09.2006 в 21:11)
| | Всё понял. Спасибо что описали на пальцах. | |
|
|
|