我的一个词充满了一些标点符号。
$word = "'Ankara'da!?'";
我想在标点符号之前或之后添加空格。 除了在单词中间的撇号字符。 结果在字母或标点之间必须只有一个空格。
必填结果:' Ankara'da ! ? '
我在下面尝试并添加了口音土耳其字符。 (因为\w
没有用)
preg_replace('/(?![a-zA-Z0-9ğüışöçİĞÜŞÖÇ])/ig', " ", $word);
结果:'Ankara 'da ! ? '
答案 0 :(得分: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 ! ? '
请参阅the PHP demo。
\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)
);
'~(?!\b\'\b)\p{P}~u'
模式匹配任何不是'
用字符括起来的标点符号,这个符号用空格括起来,然后使用'~^\s+|\s+$|(\s){2,}~u'
模式删除所有的空格。字符串的开头/结尾,并将所有其他位置的所有空格缩小为1。