PHP:仅显示每个单词的首字母+包含标点符号

时间:2018-06-29 19:57:14

标签: php regex

我正在使用以下代码来仅显示字符串中每个单词的第一个字母。例如,“ Hello World!”将显示为“ H W”。但是,我还希望包括这样的标点符号:“ H W!”

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

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


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

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

2 个答案:

答案 0 :(得分: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-“ Unicode”修饰符,可启用PCRE_UTF和PCRE_UCP动词以完全启用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!

答案 1 :(得分:0)

要匹配并删除所有不是第一个word charactersword boundary,请使用\B和非regex demo

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

请参见PHP demothis

请注意,数字属于\w。如果需要,请改为使用[A-Za-z]或带有\pL标志的Unicode u