首页 > 解决方案 > PHP:仅显示每个单词的第一个字母+包括标点符号

问题描述

我使用下面的代码只显示字符串中每个单词的第一个字母。例如,“你好世界!” 将显示为“H W”。但是,我还想包括这样的标点符号:“HW!”

如何修改我的代码以保留标点符号?

$editversetext = preg_split("/[\s,_-]+/", $editversetext);
$initials = "";


foreach ($editversetext as $w) {
  $initials .= $w[0];

}
$initials = implode(' ',str_split($initials));
echo $initials . ".";

标签: phpregex

解决方案


您可以使用以下正则表达式来匹配您需要的内容:

'~\b(\p{L})\p{L}*(\p{P}?)~u'

请参阅正则表达式演示

细节

  • \b- 单词边界
  • (\p{L})- 捕获组#1:一封信
  • \p{L}*- 0+ 个字母
  • (\p{P}?)- 捕获组 #2:可选标点符号(注意:如果您还想匹配符号,请替换\p{P}[\p{P}\p{S}]
  • u- 启用 PCRE_UTF 和 PCRE_UCP 动词以完全启用 Unicode 支持的“Unicode”修饰符。

根据您的输入,您可以使用替换方法,或者您可以收集匹配项,然后以您现在正在执行的类似方式将它们组合成您需要的结果。

查看PHP 演示

$str = 'Hello World!';
// Replacing approach (if all words are matches):
echo preg_replace('~\b(\p{L})\p{L}*(\p{P}?)~u', '$1$2', $str) . "\n"; // => H W!

// Collecting/post-processing (if there are non-matching sequences)
$res = [];
preg_replace_callback('~\b(\p{L})\p{L}*(\p{P}?)~u', function($m) use (&$res) {
        $res[] = $m[1].$m[2];
        return '';
    }, $str);
print_r(implode(" ", $res)); // => H W!

推荐阅读