PHP只替换纯文本

时间:2016-10-04 22:35:51

标签: php regex laravel-5.3

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

1 个答案:

答案 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)或选择这些部分的函数。

demo