2010-02-28 26 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

相關問題