我正在使用以下代码来仅显示字符串中每个单词的第一个字母。例如,“ 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 . ".";
答案 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 characters的word boundary,请使用\B
和非regex demo。
$str = preg_replace('/\B\w+/', "", $str);
请注意,数字属于\w
。如果需要,请改为使用[A-Za-z]
或带有\pL
标志的Unicode u
。