Замените пробелы вокруг знаков препинания в переполнении стека

Я пытаюсь заменить конечные пробелы вокруг знаков препинания в 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

Решение

Вы ничего не захватываете, а затем пытаетесь заменить второй несуществующей группой захвата. Попробуйте захватить группу () а затем использовать его $1:

$string = preg_replace('/\s*([[:punct:]])\s*/', '$1 ', $string);
1

Другие решения

Это должно работать для вас:

<?php

$string = "Hello  , I am here   ! Not anymore. ..  ";
echo $string = preg_replace('/(\s*)([[:punct:]])(\s*)/', '$2 ', $string);

?>

Выход:

Hello, I am here! Not anymore. . .
1

Для того, чтобы заменить . . . с ...вот что я бы сделал:

$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 свойство Юникод для пунктуации, посмотреть документ.
(?= ) это позитивный взгляд вперед
а также (?<= )положительный взгляд позади, посмотреть документ.

1
По вопросам рекламы [email protected]