|
|
|
| Объсните пожалуйста на простом примере, как работают эти модификаторы, в чем заключается их смысл? Не могу понять из описания.
например вот такой скрипт выводит 1:
<?php
$str = 'a
b
c';
$pattern = "#[c]#m";
echo preg_match($pattern, $str);
?>
|
Как и вот эти два его варианта:
<?php
$str = 'a
b
c';
$pattern = "#[c]#s";
echo preg_match($pattern, $str);
?>
|
<?php
$str = 'a
b
c';
$pattern = "#[c]#";
echo preg_match($pattern, $str);
?>
|
| |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(09.07.2009 в 15:56)
| | так а собственнно... 1 - значит что строка соответствует образцу.
Почему Вы полагаете, что это не так?
$str = 'abcde' тоже соответствует. | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(09.07.2009 в 15:56)
| | Вы сначала разберитесь как работает preg_match(), а потом спрашивайте что не понятно в регвыражениях... | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(09.07.2009 в 15:56)
| |
m (PCRE_MULTILINE)
По умолчанию PCRE обрабатывает данные как однострочную символьную строку (даже если
она содержит разделители строк). Метасимвол начала строки '^' соответствует только началу
обрабатываемого текста, в то время как метасимвол "конец строки" '$' соответствует концу
текста, либо позиции перед завершающим текст переводом строки (в случае, если
модификатор D не установлен). В Perl ситуация полностью аналогична. Если этот
модификатор используется, метасимволы "начало строки" и "конец строки" также
соответствуют позициям перед произвольным символом перевода и строки и
, соответственно, после. Это соответствует Perl-модификатору \m. В случае, если
обрабатываемый текст не содержит символов перевода строки, либо шаблон не содержит
метасимволов '^' или '$', данный модификатор не имеет никакого эффекта.
s (PCRE_DOTALL)
Если данный модификатор используется, метасимвол "точка" в шаблоне соответствует всем
символам, включая перевод строк. Без него - всем, за исключением переводов строк. Этот
модификатор эквивалентен записи /s в Perl. Класс символов, построенный на отрицании
, например [^a], всегда соответствует переводу строки, независимо от наличия этого
модификатора.
|
Какое место конкретно непонятно? | |
|
|
|
|
|
|
|
для: GeorgeIV
(09.07.2009 в 16:11)
| |
В Perl ситуация полностью аналогична. Если этот
модификатор используется, метасимволы "начало строки" и "конец строки" также
соответствуют позициям перед произвольным символом перевода и строки и
, соответственно, после. Это соответствует Perl-модификатору \m.
|
Смысл этого понятен. А вот на практике кое-что не срабатывает.
Как я понимаю, этот код должен выводить единицу, потому что "b" находится в конце первой строки (пробелов в конце строки нет, я проверил). Однако у меня он выводит нуль.
<?php
$str = "a--b
c--d";
$pattern = "|b$|m";
echo preg_match($pattern, $str);
?>
|
Почему не находится соответствие шаблону?
P.S. Как работает модификатор "s" теперь полностью понятно, спасибо за описание, у меня имелся более краткий вариант. | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(11.07.2009 в 09:35)
| |
Если этот модификатор используется, метасимволы "начало строки" и "конец строки"
также соответствуют позициям перед произвольным символом перевода и строки и
, соответственно, после.
|
m - означате multiline, соответственно переносы строк не являются концом текста, для анализа берется весь текст. В примере конец - это d. | |
|
|
|
|
|
|
|
для: GeorgeIV
(11.07.2009 в 11:40)
| | Не могли бы Вы привести какой-нибудь простой пример с метасимволом $ в котором при использовании модификатора m соответствие шаблону будет найдено, а при отсутствии использования этого модификатора - не будет?
А то что-то я совсем запутался..... | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(11.07.2009 в 13:44)
| |
$str = "a--b\r
c--d";
$pattern = "/\r$/m";
echo preg_match($pattern, $str);
|
| |
|
|
|
|
|
|
|
для: GeorgeIV
(11.07.2009 в 15:46)
| |
m - означате multiline, соответственно переносы строк не являются концом текста, для
анализа берется весь текст. В примере конец - это d.
|
С этой фразой, я все таки не прав. Все с точностью наоборот в первой фразе, только с дополнением, что переносы строк также начинают иметь позицию в строке, а не являются просто концом строки. | |
|
|
|
|
|
|
|
для: GeorgeIV
(11.07.2009 в 15:51)
| | Большое спасибо за дополнение! Теперь все понятно. Концом строки является не последний видимый символ в ней, а символ переноса строки - \r. И, например, чтобы определть заканчивается ли какая-либо из строк текста на "b" можно использовать вот такой скрипт:
<?php
$str = "a--b
c--d";
$pattern = "/b\r$/m";
echo preg_match($pattern, $str);
?>
|
Который теперь работает!!! | |
|
|
|
|
|
|
|
для: alexey_tihonenko
(11.07.2009 в 16:11)
| | Боюсь, что это самая неустойчивая проверка, я пробовал это код сохранять в форматах юникса и винды и получал разный результат. | |
|
|
|
|
|
|
|
для: GeorgeIV
(11.07.2009 в 16:21)
| | Ну, у меня практической цели не было сейчас, я пока просто изучаю регулярные выражения. Главное было понять как работают модификаторы "s" и "m" в связке с PHP. Этой цели вполне удалось достичь. Еще раз спасибо за ответы! | |
|
|
|
|
|
|
|
для: Alexey_Tihonenko
(11.07.2009 в 16:37)
| | Этот вариант работает под Юниксом,
<?php
$str = "a--b
c--d";
$pattern = "/b$/m";
echo preg_match($pattern, $str);
?>
|
а этот под виндой
<?php
$str = "a--b
c--d";
$pattern = "/b\r$/m";
echo preg_match($pattern, $str);
?>
|
Так что, не все так однозначно, но по крайней мере яснее, чем вначале. | |
|
|
|
|
|
|
|
для: GeorgeIV
(11.07.2009 в 16:51)
| | т.е. первый вариант не работает под виндой? | |
|
|
|
|
|
|
|
для: ddhvvn
(11.07.2009 в 18:58)
| | Первый вариант под виндой выводит 0. preg_match не находит совпадения. | |
|
|
|
|
|
|
|
для: alexey_tihonenko
(11.07.2009 в 20:28)
| | Даже если так, то нужно сделать кроссбраузерный вариант | |
|
|
|