- 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% на первый месяц обслуживания! При переходе по баннеру - скидка 25% на первый месяц обслуживания!