以下PHP函数用波斯数字替换所有拉丁数字,但它也替换了HTML标签属性的所有拉丁数字,这使得它们不再工作,我想替换纯文本的数字,请帮助我,如果知道该怎么做,谢谢。
public static function LatinToPersianDigits($html)
{
$Latin= ['0','1','2','3','4','5','6','7','8','9'];
$Persian= ['۰','۱','۲','۳','۴','۵','۶','۷','۸','۹'];
return str_replace($latin, $persian, $html);
}
答案 0 :(得分:1)
一个例子:
const TRANSDIGIT = [ '۰','۱','۲','۳','۴','۵','۶','۷','۸','۹' ];
public static function LatinToPersianDigits($html)
{
libxml_use_internal_errors(true);
$dom = new \DOMDocument;
$dom->loadHTML('<?xml encoding="utf-8" ?><div>' . $html . '</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
libxml_clear_errors();
$xp = new \DOMXPath($dom);
$textNodeList = $xp->query('//text()');
foreach($textNodeList as $textNode) {
$textNode->parentNode->replaceChild($dom->createTextNode(strtr($textNode->nodeValue, self::TRANSDIGIT)), $textNode);
}
$result = '';
foreach ($dom->documentElement->childNodes as $childNode) {
$result .= $dom->saveHTML($childNode);
}
return $result;
}
如果你需要更聪明的东西来选择文本的特定部分,你总是可以建立一个模式(preg_replace_callback
)或选择这些部分的函数。