繁体   English   中英

PHP:只显示每个单词的第一个字母+包括标点符号

[英]PHP: Show Only the First Letter of Each Word + Include Punctuation

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

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

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


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

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

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

'~\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 - “Unicode”修饰符,它使PCRE_UTF和PCRE_UCP动词能够完全启用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!

要匹配和删除不是第一个的所有单词字符 ,请使用\\B单词边界

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

请参阅regex演示PHP演示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM