代码之家  ›  专栏  ›  技术社区  ›  Timo Huovinen

如何用html标记将每个单词中的第一个字母括起来?

  •  3
  • Timo Huovinen  · 技术社区  · 15 年前

    如何用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-8unicode… 因为我打算用这个来支持俄语和英语。

    5 回复  |  直到 15 年前
        1
  •  7
  •   Gumbo    15 年前

    试试这个:

    $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);
    }
    
        2
  •  3
  •   cletus    15 年前

    标准警告:使用regex操作html是一个坏主意,因为几乎不可能正确处理嵌套、标记内的内容和外部的内容等。因此,如果需要完整的解决方案,请分析html,然后操作文本节点。

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

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

    意思是找到一个词的边界( \b ,它是零宽度,并将以下字母包装在 <big> 元素。

        3
  •  2
  •   Gordon Haim Evgi    15 年前

    您可以使用css属性

    p { text-transform: capitalize; }
    

    Sitepoint's CSS reference on text-transform :

    资本化

    • 将每个单词中的第一个字符转换为大写;所有其他字符都不受影响–它们不会转换为小写,但会按文档中的说明显示
        4
  •  0
  •   user187291    15 年前

    我想你需要的是

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

    注意,utf8不能正常工作。

        5
  •  0
  •   Timo Huovinen    15 年前

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

    根据我的经验,regex函数在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"