2010-02-28 109 views
3

如何用HTML标签包含每个单词中的第一个字母?如何用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工作... ,因为我正打算支持俄罗斯和这个英文。

+2

如果你只是想以不同的方式显示出来:你有没有尝试':第一letter'伪元件? (请参阅http://www.w3.org/TR/CSS2/selector.html#first-letter) – Gumbo 2010-02-28 14:08:22

+0

感谢提示,我需要替换每个单词的第一个字母,而不仅仅是句子。 – 2010-02-28 14:22:45

+0

你为什么需要这样做?它需要服务器端,还是会做? – 2010-02-28 15:13:08

回答

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); 
} 
+0

我会接受这个作为接受的答案,但我真的需要它与unicode字符一起工作。 :( – 2010-02-28 14:26:39

+0

@YuriKolovsky:哦,我忘了* u *修饰符,它现在应该可以工作 – Gumbo 2010-02-28 14:36:18

+0

我不能使它工作,它仍然只选择每个“拉丁”单词的第一个字母 – 2010-02-28 15:04:08

3

标准警告:用正则表达式操作HTML是一个坏主意,因为它几乎不可能正确处理嵌套,标签内外的内容等等。所以如果你需要一个完整的解决方案,解析HTML然后处理文本节点。

在这个你已经给出的实例中,应该这样做。

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

这意味着找到一个字边界(\b),这是零宽度,并包裹在一个<big>元件以下信。

0

我想你需要的是

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

注意的是\ B不工作正确使用utf8。

+0

请注意,使用utf8无法正常工作:yes我注意到:( – 2010-02-28 15:18:34

+0

它适用于拉丁字符,但不适用于UTF-8 例如:“test text”正常工作 while:“тесттехт”outputs:Ñ ,ÐμÑÑ,ÑÑÐμÑ...ñ, – 2010-03-03 10:20:45

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" 
+0

如果你期望多字节字符串,那么你应该使用多字节函数。 – Gumbo 2010-02-28 15:00:42

+0

哦,你的权利。 只需在php.ini中设置这些内容 mbstring.func_overload“7” mbstring.internal_encoding“UTF-8” – 2010-02-28 15:07:47

2

你可以使用CSS属性

p { text-transform: capitalize; } 

Sitepoint's CSS reference on text-transform

capitaliz e

  • 将每个单词中的第一个字符转换为大写;所有其他字符不受影响 - 他们没有转化为小写,但还是会写在文件中
+0

感谢戈登,我其实知道那个编写参考的人:) 其中最好的一个呢。 但我不需要大写已经大写的句子的每个字母text-transform:uppercase; ;) – 2010-02-28 15:13:59

+0

@YuriKolovsky会将文本转换为:大写; font-variant:Small-caps; }是一个解决方案吗? – Gordon 2010-02-28 15:25:05

+1

我正在做一些Q/A维护:是的,这将是一个解决方案,适用于除IE5以外的所有浏览器。这将是最优雅的解决方案,如果我没有提到HTML,这将是最好的答案。我不知道你为什么不起身 - 投了更多。 – 2010-09-15 12:09:46

相关问题