我想使用PHP函数将英文数字(0,1,2,3,...)转换为某些HTML文档内容中的阿拉伯数字(0,1,2,3,...)。登记/> 我写了这个函数:
function en2ar($str) {
$ends = array('0','1','2','3','4','5','6','7','8','9');
$ards = array('۰','۱','۲','۳','۴','۵','۶','۷','۸','۹');
return str_replace($ends,$ards,$str);
}
但它会转换文档中的所有数字,而我只想转换文档内容中的数字 例如,我想转换:
<h1 style="color: #333;">1</h1>
<div style="width: 180px;">2</div>
为:
<h1 style="color: #333;">۱</h1>
<div style="width: 180px;">۲</div>
但它转换为:
<h۱ style="color: #۳۳۳;">۱</h۱>
<div style="width: ۱۸۰px;">۲</div>
并使文档无效。
答案 0 :(得分:1)
您可以尝试使用像DOMDocument这样的HTML解析器。
以下是一个例子:
$html =
'<!DOCTYPE HTML>
<html>
<head></head>
<body>
<h1 style="color: #333;">1</h1>
<div style="width: 180px;">2</div>
</body>
</html>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$doc->encoding = 'UTF-8'; //Appropriate encoding HERE
$root = $doc->documentElement;
var_dump($doc->saveHTML());
iterate($root);
var_dump($doc->saveHTML());
function iterate($node)
{
if($node->nodeType === XML_TEXT_NODE) {
$node->nodeValue = en2ar($node->nodeValue);
}
if ($node->hasChildNodes()) {
$children = $node->childNodes;
foreach($children as $child) {
iterate($child);
}
}
}
要将输出保存到变量,请使用:
$var = $doc->saveHTML();
输出:
string '<!DOCTYPE HTML>
<html><head></head><body>
<h1 style="color: #333;">1</h1>
<div style="width: 180px;">2</div>
</body></html>
' (length=135)
string '<!DOCTYPE HTML>
<html><head></head><body>
<h1 style="color: #333;">۱</h1>
<div style="width: 180px;">۲</div>
</body></html>
' (length=147)
答案 1 :(得分:0)
我的评论所说的大致概述:
$doc = new DOMDocument();
$doc->loadHTML('<h1 style="color: #333;">1</h1><div style="width: 180px;">2</div>');
$xpath = new DOMXPath($doc);
$textnodes = $xpath->query('//text()');
foreach ($textnodes as $textnode) {
$textnode->nodeValue = en2ar($textnode->nodeValue);
}
echo $doc->saveHTML();
警告:未经考验。算法很简单:加载dom,获取文本节点,每次更改值,保存修改后的dom。
答案 2 :(得分:0)
除了用于标记的>
和<\
之外,这将替换标记中的所有数字:
function en2ar ($str) {
$ends = array('0','1','2','3','4','5','6','7','8','9');
$ards = array('۰','۱','۲','۳','۴','۵','۶','۷','۸','۹');
foreach ($ends as $key => $num) {
$str = preg_replace('/(>.+)('.$num.')(.+<\/)/','$1'.$ards[$key].'$3',$str);
}
return $str;
}