【问题标题】:Is there any option to separate special characters from words with regex/preg_split?是否有任何选项可以使用 regex/preg_split 将特殊字符与单词分开?
【发布时间】:2020-05-09 12:40:25
【问题描述】:

我是初级,不熟悉正则表达式,我正在尝试使用正则表达式和 preg_split 来制作带有句子的密码生成器。

除了一件事,一切都完成了,例如“我有 2 只猫”这句话。结果应为“I'vg2c”。但我唯一拥有的是“Ig2c”,因为我用空格分隔( preg_split("/[\s]|/", $string, -1, PREG_SPLIT_NO_EMPTY); ) 确实在单词和特殊字符之间没有任何空格。

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

代码如下:

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"


【问题讨论】:

  • 您还没有共享所有代码,因此不太清楚为什么会得到该输出。如果您需要保留特殊字符,请使用preg_split("/([[:punct:]])|\s|/", $string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
  • 非常感谢。我已经编辑了我的帖子以放置整个代码
  • 请减少代码以展示当前问题。
  • 另外添加几行:例如:input: initiales("I've got two cats and a dog!"); 和下一行,expected_output: write_here_what_the_function_should_return。添加一些示例,以便我们更好地了解您的问题。
  • 也许你想要function initiales($string) { return preg_replace('~\b(\w)\w*|\s+~u', '$1', $string); }

标签: php regex explode preg-split


【解决方案1】:

你可以使用

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 感知。

【讨论】:

  • 不幸的是,这与重音不匹配:输入:initiales("Je suis arrivée le 17 septembre.");输出:“Jsaéel17s。”预期输出:“Jsal17s。”
  • @MarieSeleneBonifacio 现在,确实如此。见the PHP demo
猜你喜欢
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
相关资源
最近更新 更多