2014-04-28 150 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是的,你是对的。编辑。 –