【问题标题】:PHP: Show Only the First Letter of Each Word + Include PunctuationPHP:仅显示每个单词的第一个字母+包括标点符号
【发布时间】:2018-06-29 19:57:14
【问题描述】:

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

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

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


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

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

【问题讨论】:

标签: php regex


【解决方案1】:

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

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

请参阅regex demo

详情

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

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

PHP demo

$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!

【讨论】:

    【解决方案2】:

    要匹配并删除不是第一个的所有word characters,请使用\B 而非word boundary

    $str = preg_replace('/\B\w+/', "", $str);
    

    regex demoPHP demo

    请注意 digitis 属于 \w。如果需要,请使用 [A-Za-z] 或 unicode \pLu 标志。

    【讨论】:

      猜你喜欢
      • 2014-10-21
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多