Сделано в Раскрутке

Архив эхоконференции RU.PHP

- RU.PHP ------------------------------------------------------------- RU.PHP -
 Msg  : #11059 [552]
 От   : Kalachihin Vladimir           2:5095/1.39         30 октября 04, 19:21
 Кому : Dmitry Pljonkin                                   04 ноября 04, 01:28
 Тема : Помогите слабоумному в regexp!
-------------------------------------------------------------------------------
Приветствую тебя, Dmitry!

Replying to a message of Dmitry Pljonkin to Kalachihin Vladimir:

 >> Облом. В ситуации  $str = "лалал лаы тип1: \ТИП1sdfs" - т.е., когда из
 >> двух подряд маркеров второй не отделяется пробелом от маркируемого
 >> слова - второй маркер игнорируется и остаётся в строке.

 DP> А это... не врите! :)
 DP> Давай свою строчку сюда - у меня пока все работает нормально.

ну если есть желание разбираться, то я дам не абстрактный пример, а реальный
код, где оно должно работать:

$f31000 = 'Отдельные отрасли естествознания см. \BВ Физико-математические
науки, \BГ Химические науки, \BД Геолого-географические науки, \BЕ
Биологические науки.';

// Если может встретиться \ТИП1тип1:,
// то \s+ после первых скобок надо
// заменить на \s*
$seeto[] = '/(см\.|\\\B)(\s+(тип1:|\\\ТИП1))+/';
$replace[] = '\1';
$seeto[] = '/(см\.|\\\B)\s*(\S+)(\s+|\.|;|,|:|$)/';
$replace[] = '\2\3';

echo preg_replace($seeto, $replace, $f31000);

Как легко догадаться, первый маркер - это "см.", а второй - "\B". В подавляющем
большинстве случаев маркер "\B" отсутствует.


 >> Короче, я понял - проще разобрать строку пословно. 

 DP> Пословно в данном случае разбираться - дикий изврат. По сложности 
 DP> примерно тоже самое, что и регэксп сочинить (смысл-то тот же -
 DP> условия  проверять), только кода будет не 5 строк, а в разы больше.

Кода будет строк пятнадцать, но он будет легко понимаем и устойчив к ошибкам.
Даже если он будет работать в десять раз медленнее - и хрен бы с ним.



                                Калачихин Владимир.

--- FleetStreet 1.22+
 * Origin: Stager's station, aka stagerATau.ru (2:5095/1.39)


При переходе по баннеру - скидка 25% на первый месяц обслуживания!
Самый простой способ получить ROOT-доступ
При переходе по баннеру - скидка 25% на первый месяц обслуживания!