Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > preg_replace небольшйо нюанс


Автор: Frozen_Coyote 9.12.2008, 17:30
Здравствуйте,

небольшая помощь требуется

задача:
из строки вида t1+pt1+zzt23+t45 сделать строку вида 0+pt1+zzt23+0, т.е. заменить в ней комбинацию t{любой-набор-цифр} на НОЛЬ, но при условии что t - первая после знака +, если она идет после любого другого символа - оставлять фрагмент без изменений.

Регулярку я составил, отрабатывает без проблем но натолкнулся на следующую штучку

выражение

Код

$s = "t1+pt1+zzt23+t45";
echo preg_replace("/(^t\d*)|(([^a-z])t\d*)/","$3 0",$s);


выводит все как бы правильно (0+pt1+zzt23+ 0 ), но видите - приходится писать $3 пробел 0, и на выходе между последним + и 0 лепится пробел. Если же пробел в теле параметра не ставить то получается $30, а это неправильно. Подскажите, как избавиться от пробела этого на выходе? Как правильно сформировать параметр этот?

спасибо

Автор: unicross 9.12.2008, 17:56
Код

<?php
$s = "t1+pt1+zzt23+t45";
echo preg_replace('#(?<=^|[+])t\d+#si', '0', $s);
?>

или так
Код

<?php
$s = "t1+pt1+zzt23+t45";
echo preg_replace("/(^t\d*)|(([^a-z])t\d*)/","\${3}0",$s);
?>

Автор: Frozen_Coyote 9.12.2008, 18:01
спасибо, хорошее решение

Автор: amg 10.12.2008, 14:15
Код
preg_replace("/\bt\d*\b/", 0, $s);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)