Forum Webscript.Ru

Программирование => Регулярные выражения => Тема начата: Lucent от 23 Октября 2003, 12:42:26

Название: Вырезка содержимого Body + регулярные выражения
Отправлено: Lucent от 23 Октября 2003, 12:42:26
Нужно вырезать содержимое , для этого использую
preg_match("/]{0,}>(.*)<\\/body>/i",$buf,$u);
Это работает только с предварительным использованием
$buf=str_replace("\\r\\n",\'\',$buf), но не всегда (не могу понять почему).
То есть дело в символах перевода строки. Как правильно составить регулярное выражение и не использовать str_replace().
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: Макс от 23 Октября 2003, 12:48:33
модификатор s добавь
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: ondr от 23 Октября 2003, 13:17:05
И еще {0,} замени на *? или на {0,}?
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: Yukko от 23 Октября 2003, 13:24:53
ondr
А можно узнать чем вызвано применение квантификатора к квантификатору? Я не понимаю этой конструкции, я не понимаю смысла применения этой конструкции...
ИМХО .*? вместо {0,}  будет достаточно
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: mike от 23 Октября 2003, 13:39:05
Там в принципе все равно, что применять, т.к. используется символьный класс [^>], а вот максимальный квантификатор может быть лучше оптимизирован в PCRE. И тогда уж не {0,}, а * :) По меньшей мере, оно читабельней.
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: ondr от 23 Октября 2003, 13:39:55
Yukko
[^>]{0,} - будет найдена максимальная строка не содержащая ">". Не так ли? Когда нужно минимальное значение, т.е. [^>]{0,}? или [^>]*?.

.*? - это ты про что?
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: ondr от 23 Октября 2003, 14:11:54
Ребята сорри. Беру назад свои посты. Я сегодня с утра торможу...
Все было и так нормально. Менять ничего не надо.
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: Lucent от 23 Октября 2003, 15:07:48
[Макс
Насчет S можно поподробней? Это не то же самое, что [\\r\\n]{0,}.
Поясню, сoдержимое файла (обязательно есть "перенос строки"):

1111\';
Коректно вырезать \'1111\' я могу добавляя [\\r\\n]{0,}, то есть
preg_match("/]{0,}>[\\r\\n]{0,}(.*)<\\/body>/i",$z,$u);

Но если содержимое будет:

1111
2222\';
То есть теперь переводы строк находятся уже в самом (.*). Насколько я понимаю .* - "соответствует определенному символу многократно, если тот существует", но кроме перевода строк.

Как быть, то есть вырезать "11112222"?
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: Lucent от 23 Октября 2003, 15:25:25
Почему не проходит
preg_match("/]{0,}>[\\s]{0,}([.*[\\s]{0,}]{0,})[\\s]{0,}<\\/body>/i",$z,$u);
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: Макс от 23 Октября 2003, 15:35:21
модификаторы ставятся после рег. выражения (там где у тебя i стоит - он тоже является модификатором)
/]{0,}>(.*)<\\/body>/is
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: Lucent от 23 Октября 2003, 15:51:16
Макс
1. \\s - можно ставить и в регулярное выражение
2. После /.../s - все получилось так как мне нужно было.

Огромное спасибо.
Название: Вырезка содержимого Body + регулярные выражения
Отправлено: Макс от 23 Октября 2003, 17:24:18
\\s в регулярных выражениях - это метасимвол совпадающий с символами пробела, таблуляции, новой строки и вроде еще что-то
а еще есть  модификатор s - он разрешает, чтобы символ точка в регекспе (означающая любой символ) могла совпадать и с символом новой строки (по умолчанию точка с \\n не совпадает)