PHP 仅替换纯文本

PHP replace only plain text

下面的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);
}

一个例子:

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;
}

如果您需要对文本的特定部分 select 进行更巧妙的处理,您可以随时为 select 这些部分构建一个模式(对于 preg_replace_callback)或一个函数。

demo