主要是修改了prepare方法,自己项目使用,未做优化,稍看了下源代码,应该可以加入option来使用,后面再说吧。
protected function prepare($string, $option = \PINYIN_DEFAULT)
{
$string = preg_replace_callback('~[a-z0-9_-]+~i', function ($matches) {
return "\t".$matches[0];
}, $string);
$regex = array('\p{Han}', '\p{Z}', '\p{M}', "\t");
if ($this->hasOption($option, \PINYIN_KEEP_NUMBER)) {
\array_push($regex, '0-9');
}
//a-zA-Z_添加_保留,即如果源数据中存在_也保留
if ($this->hasOption($option, \PINYIN_KEEP_ENGLISH)) {
\array_push($regex, 'a-zA-Z_');
}
//判断是否存在空格,如果存在则转为下划线
$string = preg_replace_callback('~\s~i', function ($matches) {
return "_".$matches[0];
}, $string);
if ($this->hasOption($option, \PINYIN_KEEP_PUNCTUATION)) {
$punctuations = array_merge($this->punctuations, array("\t" => ' ', ' ' => ' '));
$string = trim(str_replace(array_keys($punctuations), $punctuations, $string));
\array_push($regex, preg_quote(implode(array_merge(array_keys($this->punctuations), $this->punctuations)), '~'));
}
$str = preg_replace(\sprintf('~[^%s]~u', implode($regex)), '', $string);
return $str;
}