Я пытаюсь заменить конечные пробелы вокруг знаков препинания в PHP на совпадающие знаки препинания, за которыми следует один пробел.
Например "Hello , I am here ! Not anymore. .. "
должен стать "Hello, I am here! Not anymore... "
, Я пытаюсь использовать регулярные выражения со ссылкой
PHP
$string = preg_replace('/\s*[[:punct:]]\s*/', '$2 ', $string);
Но фрагмент удаляет знаки препинания: "Hello I am here Not anymore"
,
Что мне не хватает?
Вы ничего не захватываете, а затем пытаетесь заменить второй несуществующей группой захвата. Попробуйте захватить группу ()
а затем использовать его $1
:
$string = preg_replace('/\s*([[:punct:]])\s*/', '$1 ', $string);
Это должно работать для вас:
<?php
$string = "Hello , I am here ! Not anymore. .. ";
echo $string = preg_replace('/(\s*)([[:punct:]])(\s*)/', '$2 ', $string);
?>
Выход:
Hello, I am here! Not anymore. . .
Для того, чтобы заменить . . .
с ...
вот что я бы сделал:
$string = "Hello , I am here ! Not anymore. . . ";
$string = preg_replace('/\s+(?=\pP)|(?<=\pP\s)\s+/', '', $string);
echo $string;
Выход:
Hello, I am here! Not anymore...
\pP
свойство Юникод для пунктуации, посмотреть документ.
(?= )
это позитивный взгляд вперед
а также (?<= )
положительный взгляд позади, посмотреть документ.