php - PHP:仅显示每个单词的第一个字母+包括标点符号
问题描述
我使用下面的代码只显示字符串中每个单词的第一个字母。例如,“你好世界!” 将显示为“H W”。但是,我还想包括这样的标点符号:“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
- 启用 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!
推荐阅读
- laravel - Laravel 获取其上方和下方记录的行
- xslt - WSO2 EI:文本 xmlns 在由 xslt 中介转换消息后被添加
- php - 当我只需要显示一些信息时,如何避免创建复杂的聚合根?
- angular - 在 Ionic 的 ngFor 中显示图像
- javascript - 在 JavaScript 中处理对象数组
- java - 了解 Spring MVC 应用程序上下文
- python - 为什么 Image.resize 会裁剪图像
- php - PHP - 获取第一个标签
- sql-server - SQL Server - 触发器。用另一个表中的列数更新一个表上的列
- apache-httpclient-4.x - spring-ws 已弃用 DefaultHttpClient