preg_replace добавить пробел до и после знаков препинания

У меня есть слово, заполненное некоторыми пунктуациями.

$word = "'Ankara'da!?'";

Я хочу поставить пробелы до или после знаков препинания.
За исключением символа апострофа, который находится в середине слова.
В результате между буквами или пунктуацией должен быть только один пробел.

Требуемый результат: ' Ankara'da ! ? '

Я попробовал ниже и добавил акцент турецких символов. ( так как \w не работал)

preg_replace('/(?![a-zA-Z0-9ğüışöçİĞÜŞÖÇ])/ig', " ", $word);

Результат: 'Ankara 'da ! ? '

1

Решение

Если вам нужно добавить только один пробел между символами пунктуации и не добавлять их в начале / конце строки, вы можете использовать следующее решение:

$word = "'Ankara'da!?'";
echo trim(preg_replace_callback('~\b\'\b(*SKIP)(*F)|\s*(\p{P}+)\s*~u', function($m) {
return ' ' . preg_replace('~\X(?=\X)~u', '$0 ', $m[1]) . ' ';
}, $word)); // => ' Ankara'da ! ? '

Увидеть демонстрация PHP.

\b\'\b(*SKIP)(*F) часть соответствует и пропускает все ' которые заключены в символы слова (буквы, цифры, знаки подчеркивания и некоторые более редко используемые символы слова). \s*(\p{P}+)\s* часть соответствует 0+ пробелам, затем захватывает 1+ знаки препинания (включая _!) в группу 1, а затем любые 0+ пробелы сопоставляются. Затем после каждого символа Unicode добавляются одиночные пробелы (\X), за которым следует другой символ Unicode ((?=\X)). Внешние начальные / конечные пробелы позже удаляются trim()).

Есть способ сделать это с

$word = "'Ankara'da!?'";
echo preg_replace('~^\s+|\s+$|(\s){2,}~u', '$1',
preg_replace('~(?!\b\'\b)\p{P}~u', ' $0 ', $word)
);

Увидеть еще одна демонстрация PHP

'~(?!\b\'\b)\p{P}~u' шаблон соответствует любой пунктуации, которая не ' заключенный в слово chars, и этот символ заключен в пробелы, а затем '~^\s+|\s+$|(\s){2,}~u' pattern используется для удаления всех пробелов в начале / конце строки и сжимает все пробелы в 1 во всех других местах.

1

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

Других решений пока нет …

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