是否有任何选项可以将特殊字符与 regex/preg_split 的单词分开?

Is there any option to separate special characters from words with regex/preg_split?

我是初级的,对正则表达式不放心,我正在尝试用正则表达式和 preg_split 的句子做一个密码生成器。

一切都完成了,除了一件事,例如句子 "I've got 2 cats." 应该结果为 "I'vg2c." 但我唯一拥有的是 "Ig2c" 因为我用白色分开 spaces ( preg_split("/[\s]|/", $string, -1, PREG_SPLIT_NO_EMPTY); ) 而且单词和特殊字符之间确实没有任何白色 space 。

那么是否有任何“"simple"”选项可以使用 regex/preg_split 或其他方式将特殊字符与单词分开并保留它? :s (不知道我是否清楚,对不起我的英文)

这是代码:

session_start();


$string = !empty($_POST['sentence']) ? $_POST['sentence'] : NUll;

function initiales($string)
{
  $words = preg_split("/[\s]/", $string, -1, PREG_SPLIT_NO_EMPTY);
  // $words = explode(" ", $string);
   $initiale = '';
   foreach($words as $init){
     $initiale .= $init{0};
   }
  return $initiale;
}
?>



What I want : 

input: initiales("I've got 21 cats and 1 dog!");

expected_output: "I'vg21ca1d!"

unexpected_output: "Ig2ca1d"


您可以使用

function initiales($string) { 
    return preg_replace('#\B\p{L}\p{M}*+|\s+#u', '', $string); 
}

PHP demo

模式匹配

  • \B\p{L}\p{M}*+ - 任何不在单词开头的字母 + 其后的任何变音符号
  • | - 或
  • \s+ - 1 个或多个空格。

u 修饰符用于匹配任何 Unicode 空格并使 \B 识别 Unicode。