У меня есть слово, заполненное некоторыми пунктуациями.
$word = "'Ankara'da!?'";
Я хочу поставить пробелы до или после знаков препинания.
За исключением символа апострофа, который находится в середине слова.
В результате между буквами или пунктуацией должен быть только один пробел.
Требуемый результат: ' Ankara'da ! ? '
Я попробовал ниже и добавил акцент турецких символов. ( так как \w
не работал)
preg_replace('/(?![a-zA-Z0-9ğüışöçİĞÜŞÖÇ])/ig', " ", $word);
Результат: 'Ankara 'da ! ? '
Если вам нужно добавить только один пробел между символами пунктуации и не добавлять их в начале / конце строки, вы можете использовать следующее решение:
$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 во всех других местах.
Других решений пока нет …