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

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

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

 

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

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

тема: Модификаторы s и m
 
 автор: Alexey_Tihonenko   (09.07.2009 в 15:56)   письмо автору
 
 

Объсните пожалуйста на простом примере, как работают эти модификаторы, в чем заключается их смысл? Не могу понять из описания.

например вот такой скрипт выводит 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);
?>

  Ответить  
 
 автор: Trianon   (09.07.2009 в 16:02)   письмо автору
 
   для: Alexey_Tihonenko   (09.07.2009 в 15:56)
 

так а собственнно... 1 - значит что строка соответствует образцу.
Почему Вы полагаете, что это не так?
$str = 'abcde' тоже соответствует.

  Ответить  
 
 автор: ddhvvn   (09.07.2009 в 16:04)   письмо автору
 
   для: Alexey_Tihonenko   (09.07.2009 в 15:56)
 

Вы сначала разберитесь как работает preg_match(), а потом спрашивайте что не понятно в регвыражениях...

  Ответить  
 
 автор: GeorgeIV   (09.07.2009 в 16:11)   письмо автору
 
   для: Alexey_Tihonenko   (09.07.2009 в 15:56)
 

m (PCRE_MULTILINE) 
По умолчанию PCRE обрабатывает данные как однострочную символьную строку (даже если
 она содержит разделители строк). Метасимвол начала строки '^' соответствует только началу
 обрабатываемого текста, в то время как метасимвол "конец строки" '$' соответствует концу
 текста, либо позиции перед завершающим текст переводом строки (в случае, если
 модификатор D не установлен). В Perl ситуация полностью аналогична. Если этот
 модификатор используется, метасимволы "начало строки" и "конец строки" также
 соответствуют позициям перед произвольным символом перевода и строки и
, соответственно, после. Это соответствует Perl-модификатору \m. В случае, если
 обрабатываемый текст не содержит символов перевода строки, либо шаблон не содержит
 метасимволов '^' или '$', данный модификатор не имеет никакого эффекта.
 
s (PCRE_DOTALL) 
Если данный модификатор используется, метасимвол "точка" в шаблоне соответствует всем
 символам, включая перевод строк. Без него - всем, за исключением переводов строк. Этот
 модификатор эквивалентен записи /s в Perl. Класс символов, построенный на отрицании
, например [^a], всегда соответствует переводу строки, независимо от наличия этого
 модификатора. 

Какое место конкретно непонятно?

  Ответить  
 
 автор: Alexey_Tihonenko   (11.07.2009 в 09:35)   письмо автору
 
   для: 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" теперь полностью понятно, спасибо за описание, у меня имелся более краткий вариант.

  Ответить  
 
 автор: GeorgeIV   (11.07.2009 в 11:40)   письмо автору
 
   для: Alexey_Tihonenko   (11.07.2009 в 09:35)
 

Если этот  модификатор используется, метасимволы "начало строки" и "конец строки" 
также  соответствуют позициям перед произвольным символом перевода и строки и 
, соответственно, после. 

m - означате multiline, соответственно переносы строк не являются концом текста, для анализа берется весь текст. В примере конец - это d.

  Ответить  
 
 автор: Alexey_Tihonenko   (11.07.2009 в 13:44)   письмо автору
 
   для: GeorgeIV   (11.07.2009 в 11:40)
 

Не могли бы Вы привести какой-нибудь простой пример с метасимволом $ в котором при использовании модификатора m соответствие шаблону будет найдено, а при отсутствии использования этого модификатора - не будет?
А то что-то я совсем запутался.....

  Ответить  
 
 автор: GeorgeIV   (11.07.2009 в 15:46)   письмо автору
 
   для: 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:51)   письмо автору
 
   для: GeorgeIV   (11.07.2009 в 15:46)
 

m - означате multiline, соответственно переносы строк не являются концом текста, для
 анализа берется весь текст. В примере конец - это d.

С этой фразой, я все таки не прав. Все с точностью наоборот в первой фразе, только с дополнением, что переносы строк также начинают иметь позицию в строке, а не являются просто концом строки.

  Ответить  
 
 автор: alexey_tihonenko   (11.07.2009 в 16:11)   письмо автору
 
   для: GeorgeIV   (11.07.2009 в 15:51)
 

Большое спасибо за дополнение! Теперь все понятно. Концом строки является не последний видимый символ в ней, а символ переноса строки - \r. И, например, чтобы определть заканчивается ли какая-либо из строк текста на "b" можно использовать вот такой скрипт:
<?php
$str 
"a--b
c--d"
;  
$pattern "/b\r$/m";  
echo 
preg_match($pattern$str);
?>

Который теперь работает!!!

  Ответить  
 
 автор: GeorgeIV   (11.07.2009 в 16:21)   письмо автору
 
   для: alexey_tihonenko   (11.07.2009 в 16:11)
 

Боюсь, что это самая неустойчивая проверка, я пробовал это код сохранять в форматах юникса и винды и получал разный результат.

  Ответить  
 
 автор: Alexey_Tihonenko   (11.07.2009 в 16:37)   письмо автору
 
   для: GeorgeIV   (11.07.2009 в 16:21)
 

Ну, у меня практической цели не было сейчас, я пока просто изучаю регулярные выражения. Главное было понять как работают модификаторы "s" и "m" в связке с PHP. Этой цели вполне удалось достичь. Еще раз спасибо за ответы!

  Ответить  
 
 автор: GeorgeIV   (11.07.2009 в 16:51)   письмо автору
 
   для: 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); 
?>

Так что, не все так однозначно, но по крайней мере яснее, чем вначале.

  Ответить  
 
 автор: ddhvvn   (11.07.2009 в 18:58)   письмо автору
 
   для: GeorgeIV   (11.07.2009 в 16:51)
 

т.е. первый вариант не работает под виндой?

  Ответить  
 
 автор: alexey_tihonenko   (11.07.2009 в 20:28)   письмо автору
 
   для: ddhvvn   (11.07.2009 в 18:58)
 

Первый вариант под виндой выводит 0. preg_match не находит совпадения.

  Ответить  
 
 автор: ddhvvn   (11.07.2009 в 23:05)   письмо автору
 
   для: alexey_tihonenko   (11.07.2009 в 20:28)
 

Даже если так, то нужно сделать кроссбраузерный вариант

  Ответить  
Rambler's Top100
вверх

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