如何用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 ...... 因为我打算用这个支持俄语和英语。
答案 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"