2014-04-28 148 views
2

我有這段代碼,我想把第一個字母改成大寫。但我無法讓它工作。作首字母大寫

preg_replace('/(<h3[^>]*>)(.*?)(<\/h3>)/i', '$1'.ucfirst('$2').'$3', $bsp)

+0

顯示世界和你想要替換的簡單文字 –

+0

[你如何解析和處理PHP中的HTML/XML?](http://stackoverflow.com/questions/3577641/how-do- you-parse-and-process-html-xml-in-php) –

回答

3

警告: HTML是不是一個正規的語言,不能正確地使用正則表達式解析。改爲使用DOM parser

$bsp = '<h3>hello</h3>'; 

$dom = new DOMDocument; 
$dom->loadXML($bsp); 

foreach ($dom->getElementsByTagName('h3') as $h3) { 
    $h3->nodeValue = ucfirst($h3->nodeValue); 
} 

echo $dom->saveHTML(); 

Demo


但如果你是絕對肯定的標記格式是總是一樣的,你可以使用正則表達式。然而,可替換的preg_replace(),使用preg_replace_callback()代替:

$bsp = '<h3>hello</h3>'; 

echo preg_replace_callback('/(<h3[^>]*>)(.*?)(<\/h3>)/i', function ($m) { 
    return $m[1].ucfirst($m[2]).$m[3]; 
}, $bsp); 

Demo

+1

或!!要麼!!!!不要使用正則表達式來解析HTML。 –

+0

@SecondRikudo:是的,我在開頭添加了一個警告。還添加了一個DOMDocument的例子。 –

+0

謝謝,這是極好:) – user3050047

-4

是否第一個字母大寫 - echo ucfirst($str)

使每一個單詞的大寫首字母 - echo ucwords($str)

+1

你甚至讀過標題嗎? –

5

使用正則表達式解析HTML總是很困難。爲了避免PHP和正則表達式,我建議使用CSS和text-transform屬性。使用

h3 { text-transform: capitalize; } 
+2

這可能是最好的解決方案。好想法。 –

+0

是的,如果使用CSS是最佳解決方案。沒有想到這一點。 +1 –

0

這樣一個DOM解析器可能是:

<?php 
$html='<h3>hello world</h3>'; 
$dom = new DOMDocument; 
$dom->loadHTML($html); 
echo ucfirst($dom->getElementsByTagName('h3')->item(0)->nodeValue); 

輸出:

Hello world 
+0

這隻適用於第一個元素。根據他最初的問題,假設他希望它能夠在所有h3元素上工作更安全。 –

0

使用DOMXPath

<?php 

$html = 'HTML String <h3>whatever</h3>'; 
$dom = new DOMDocument; 
$dom->loadHTML($html, LIBXML_HTML_NODEFDTD); //Don't add a default doctype. 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//h3') as $h3) { 
    $h3->nodeValue = ucfirst($h3->nodeValue); 
} 
echo $dom->saveHTML(); 

將捕獲所有h3 S甚至如果他們不是形式完全按照你的期望。

+0

你不需要'item->'那裏。 '$ h3-> nodeValue = ucfirst($ h3-> nodeValue);'就夠了。 –

+0

@AmalMurali是的,你是對的。編輯。 –