preg_match() и $

neko

tеam neko
preg_match() и $

есть обычный текстовый файл. строки разделены 13, 10

читаю файл в переменную, потом матчу к такой регулярке
PHP:
/(.+)$/Ums
доллар матчится к 10, в матчесах остается 13
ладно, я не гордый, делаю strtr() и 13 вообще убираю -- работает.
тогда, пишу такую
PHP:
/(.+)$(.+)$/Ums
теперь в 1ой скобке все нормально, а во второй откуда-то 13 в конце появилось (при том, что я их вообще вырезал).

это баг/фича, или я что-то принципиально недогоняю?

короче "решил" я это так: strtr() убираю 0D, и вместо долларов \x0A
кривенько это как-то.

ps
для удовлетворения собственного любопытства попробовал тоже самое сделать перлом:
PHP:
/(.+?)$/ms
делает то, что нужно
а еще PCRE :-(

вопщем запутался что-то
php 4.3.6
 

Demiurg

Guest
а теперь скажи, что тебе надо сделать.
 

neko

tеam neko
а) разобраться как работает этот доллар
б) узнать как правильно парсить мультилайн, пользуясь имеющимися "метасимволами" а не тупо ставя коды

файл я уже распарсил, хотя мне и не нравится такая метода
 

Demiurg

Guest
a. доллар это конец текста, это не символ. И даже не \n.
б. какой мультилайн? перевод строки - это такой же символ для рв как буква "х"
 

neko

tеam neko
a. доллар это конец текста, это не символ. И даже не \n.
подробнее плз
какого текста?
как насчет модификатора m?
ты уверен, в том, что пишешь?

деми, извини, но ты пост либо не читал, либо читал по диагонали
 

neko

tеam neko
спасибо, это разумеется не оно
ждем профика видимо :)
 

Demiurg

Guest
да, слона то я и не заметил ... на m внимания не обратил.
а зачем тебе s тогда ?
 

neko

tеam neko
для точки
/m только на ^$ влияет

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

Profic

just Profic (PHP5 BetaTeam)
neko
Все не просто, а очень просто :)
$ это такой же метасимвол, как и, например, \b, т.е. матчит не символ, а позицию между символами

Пища для ума :)
Код:
c:\Program Files\Apache Group\apache2\htdocs\_test>php -v
PHP 5.0.0-dev (cli) (built: Jun 28 2004 16:29:27)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v2.0.0-dev, Copyright (c) 1998-2004 Zend Technologies
    with Xdebug v2.0.0dev, Copyright (c) 2002, 2003, 2004, by Derick Rethans

c:\Program Files\Apache Group\apache2\htdocs\_test>type pcre8.php
<?php
$str = <<<EOT
line1
line2
line3
line4
EOT;
$str = str_replace ("\r", '', $str);

if (preg_match ('~(.+)$~Um', $str, $m)) {
        echo str_replace (array ("\r", "\n"), array ('\r', '\n'), $m[0]), "\n";
} else echo "bad\n";

if (preg_match ('~(.+)$(.+)$~Um', $str, $m)) {
        echo str_replace (array ("\r", "\n"), array ('\r', '\n'), $m[0]), "\n";
} else echo "bad\n";

if (preg_match ('~(.+)$\n(.+)$~Um', $str, $m)) {
        echo str_replace (array ("\r", "\n"), array ('\r', '\n'), $m[0]), "\n";
} else echo "bad\n";
?>
c:\Program Files\Apache Group\apache2\htdocs\_test>php pcre8.php
line1
bad
line1\nline2

c:\Program Files\Apache Group\apache2\htdocs\_test>
-~{}~ 16.07.04 15:51:

ЗЫ. Кстати, да, Профик пришел... :)
 

neko

tеam neko
ага, спасибо
хорошая пища

осталось непонятно как изменить второй рег, чтобы он матчил 2 строки, пропукая перенос:
Код:
~(.+)$\x0A^(.+)$~Um
кроме как так

а вообще надо подумать мне еще... :Р
 
Сверху