Странное поведение preg_replace

izbushka
На сайте с 08.06.2007
Offline
110
876

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

preg_replace('/\pP?$/u','.','text,');

Возвращает "text..". Почему две точки в конце и как побороть?

PS. вариант preg_replace('/\pP$/u','','text,').'.'; не подходит, надо сделать одним регекспом.

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#1

$var=str_replace('..','.',$var);

в чём проблема то?

Просто если точка в конце уже есть, он подставляет ещё одну.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
izbushka
На сайте с 08.06.2007
Offline
110
#2
LEOnidUKG:
в чём проблема то?

Проблема в том, что в конце может быть не только точка, а любой знак препинания, так что использовать str_replace не получится. Ну а обрабатывать результат preg_repplace'а еще одной ф-ей не интересно

LEOnidUKG:
Просто если точка в конце уже есть, он подставляет ещё одну.

Он как бы не должен: я прошу его заменить точку в конце (если есть) И конец строки на точку.

preg_replace('/\pP$/u','.','text,'); 

Так правильно работает, за исключением того, что пропускает строки без знаков препинания в конце..

A
На сайте с 19.07.2010
Offline
130
#3
izbushka:
Хотелось бы заменять любой знак препинания в конце на точку, или просто добавлять точку, если никакого знака не было.

как вариант: принудительно добавлять точку в конце строки и избавится в регулярке от '?'


$st='text,-:;,,';
echo preg_replace('/\pP+$/u', '.' , $st.'.');

еще последний пробел нужно учитывать: или trim($st) или расширить регулярку.

upd: учет последнего пробела или табуляции


$st='text,-:;,,';
echo preg_replace('/[\pP \t]+$/u', '.' , $st.'.');
.............
izbushka
На сайте с 08.06.2007
Offline
110
#4
admak:
как вариант: принудительно добавлять точку в конце строки и избавится в регулярке от '?'

Должна же регулярка это уметь.. Используя доп. функции (конкатенацию) решить можно, но хочется без них

LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#5

Опять фейшунисты, откуда они только берутся...

siv1987
На сайте с 02.04.2009
Offline
427
#6
izbushka:
Почему две точки в конце и как побороть?

Потому что там непонятно сколько символов указано, по моему один или ноль. [\pP]*$

izbushka
На сайте с 08.06.2007
Offline
110
#7
siv1987:
Потому что там непонятно сколько символов указано, по моему один или ноль. [\pP]*$

Не совсем понял о чем вы, но preg_replace('/[\pP]*$/u','.','text,'); - результат тотже.

bukachuk
На сайте с 07.09.2008
Offline
97
#8

preg_replace('/[,.!\?]$/','.','text,');
Программирование PHP,Mysql (/ru/forum/934470)
izbushka
На сайте с 08.06.2007
Offline
110
#9
bukachuk:
preg_replace('/[,.!\?]$/','.','text,');

не будет работать на тексте "text" (без запятой в конце)

siv1987
На сайте с 02.04.2009
Offline
427
#10

Ну вообщем понятно почему, шаблон применяться к каждому найденному соответствию, а метасимволы * и ? еще и не задает конкретного условия - поэтому в конце строке будет добавятся еще один символ.

Хотите "одним регкапсом" юзайте - echo preg_replace('/(?:\pP+|(\p{^P}))$/', '$1.', 'dsfsdf,');

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий