preg_replace在标点符号前后添加空格

时间:2017-11-13 08:48:23

标签: php regex tokenize

我的一个词充满了一些标点符号。

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

我想在标点符号之前或之后添加空格。 除了在单词中间的撇号字符。 结果在字母或标点之间必须只有一个空格。

必填结果:' Ankara'da ! ? '

我在下面尝试并添加了口音土耳其字符。 (因为\w没有用)

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

结果:'Ankara 'da ! ? '

1 个答案:

答案 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)
);

请参阅another PHP demo

'~(?!\b\'\b)\p{P}~u'模式匹配任何不是'用字符括起来的标点符号,这个符号用空格括起来,然后使用'~^\s+|\s+$|(\s){2,}~u'模式删除所有的空格。字符串的开头/结尾,并将所有其他位置的所有空格缩小为1。