如何在PHP中使用正则表达式获取每个单词的第一个字母

时间:2013-11-28 12:14:26

标签: php regex

我有一个字符串变量,我想得到它的每个单词的第一个字母。 我希望最终结果是首字母数组。

$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

2 个答案:

答案 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}应该覆盖驼峰情况,原始表达式涵盖了连字符-用于分隔两个单词的情况。

Regex101 Demo

答案 1 :(得分:0)

你能试试吗,

    $language = 'Sample Language';

    $language = explode(" ", $language);

    foreach ($language as $value) {
        echo $firstLetter = $value[0];
    }