如何用HTML标签包含每个单词中的第一个字母?

时间:2010-02-28 14:03:20

标签: php replace

如何用HTML标签包含每个单词的第一个字母?

例如:

$string = replace_first_word("some simple text",'<big>{L}</big>');
echo $string; //returns: <big>s</big>ome <big>s</big>imple <big>t</big>ext

修改: 哦,忘了提一点,它需要使用UTF-8 Unicode ...... 因为我打算用这个支持俄语和英语。

5 个答案:

答案 0 :(得分:7)

试试这个:

$string = preg_replace('/(?:^|\b)(\p{L})(\p{L}*)/u', '<big>$1</big>$2', 'some simple words');

或者如果你想在一个函数中使用它:

function replace_first_word($str, $format) {
    return preg_replace('/(?:^|\b)(\p{L})(\p{L}*)/u', str_replace('{L}', '$1', $format).'$2', $str);
}

答案 1 :(得分:3)

标准警告:使用正则表达式操纵HTML是一个坏主意,因为几乎不可能正确处理嵌套,标记内容与外部内容等。因此,如果您需要完整的解决方案,请解析HTML然后操作文本节点。 / p>

在你给出的这个典型的例子中,这应该这样做。

$output = preg_replace('!\b([a-zA-Z])!`, '<big>$1</big>`, $input);

这意味着找到一个零宽度的单词边界(\b),并将以下字母包装在<big>元素中。

答案 2 :(得分:2)

您可以使用CSS属性

p { text-transform: capitalize; }

来自Sitepoint's CSS reference on text-transform

  

大写

     
      
  • 将每个单词中的第一个字符转换为大写;所有其他字符保持不受影响 - 它们不会转换为小写字母,但会显示为文档中的文字
  •   

答案 3 :(得分:0)

我认为你需要的是

preg_replace('~(?<=\p{^L}|^)\p{L}~u', '<big>$0</big>', $input);

请注意\ b与utf8无法正常工作。

答案 4 :(得分:0)

这是一个更好,可能更快的版本,我刚刚发现自己,支持utf-8多字节字符。

根据我的经验,正则表达式函数在php中很慢,所以这里是一个基于字符串操作的函数。

function replace_first_word($text,$format='<big>{L}</big>'){
 //*** UTF-8 replace first letter of every word ***
 //split words
 $words = explode(' ', $text);
 //pick up each word
 foreach($words as &$word){
  //find out first letter of word
  $first = substr($word, 0,1);
  //remove first letter from word
  $word = substr($word,1);
  //replace first letter with formatted letter
  $first = str_replace('{L}',$first,$format);
  //add replaced letter to word
  $word = $first.$word;
 }
 //glue words back together and return them
    return implode(' ',$words);
}

在php6出来之前,记得在php.ini中设置这两个变量以更好地支持utf-8

mbstring.func_overload "7"
mbstring.internal_encoding "UTF-8"