我有一个字符串变量,我想得到它的每个单词的第一个字母。 我希望最终结果是首字母数组。
$language = 'Sample Language';
preg_match('/(\b[a-z])+/i', $language, $match);
print_r($match);
我得到的只是第一个单词的第一个字母。 以上打印数组([0] => S [1] => S)
如果我将其更改为
preg_match('/(\bL)+/i', $language, $match);
我可以得到第二个字的L匹配。很明显,在第一场比赛之后,它停止寻找剩下的比赛。我对正则表达式不是很了解。谁能指出我做错了什么?
输入字符串中的单词并不总是用空格分隔。这是非常不可预测的。我遇到的一些格式: “主要语言:语言” “主要语言,语言” “MainLanguage:Language-SubLanguage”在这里我想得到M,L和S
答案 0 :(得分:16)
首先使用preg_match_all
,其次你不需要+
量词:
$language = 'Sample Language';
preg_match_all('/\b\w/', $language, $match);
print_r($match);
\b
:匹配单词边界,单词边界是将单词字符与非单词字符分开的位置。单词字符通常为[a-zA-Z0-9_]
。\w
:匹配单词字符。\b\w
匹配位于单词边界位置的单词字符,在这种情况下恰好位于空格或分隔单词的字符串开头之后。如果您想要驼峰式情况,那么您可以将之前的表达式与另一个表达式结合起来,如下所示:
\b\w|(?<=\p{Ll})\p{Lu}
表达式的第二部分,即(?<=\w)\p{Lu}
应该匹配任何单词字符,如果它是一个大写字符\p{Lu}
后跟一个小写字母\p{Ll}
应该覆盖驼峰情况,原始表达式涵盖了连字符-
用于分隔两个单词的情况。
答案 1 :(得分:0)
你能试试吗,
$language = 'Sample Language';
$language = explode(" ", $language);
foreach ($language as $value) {
echo $firstLetter = $value[0];
}