替换整个页面上的字母,但不替换标签内的字母

时间:2015-07-02 02:07:24

标签: php regex

我一直在寻找这个......但没有结果。

我想使用php替换拉丁字母与西里尔字母。但我想在特定标记<notranslate>

中排除一些字词和字母

所以,如果我有:

<p><b>Ovo je neki tekst</b> i ovo sigurno <notranslate>nece preci u cirilicu</translate>, hvala !</p>

我希望它成为:

<p><b>Ово је неки текст</b> и ово сигурно <notranslate>nece preci u cirilicu</translate>, хвала !</p>

如何使用正则表达式执行此操作?

1 个答案:

答案 0 :(得分:0)

您的问题有两个问题:

1)如何将拉丁字符音译成西里尔字符?

2)如何保存&#34; notranslate&#34;之间的部分。标签

对于第一个问题,我还没有找到办法iconv。因此,解决方案是将strtr与关联数组一起使用,其中拉丁字符与西里尔字符相关联。请注意,我不是西里尔语专家,因此请随意编辑此数组以满足您的需求。

第二个问题很容易解决,使用XPath查询只选择没有标记的文本节点&#34; notranslate&#34;作为祖先。

$trans = [ 'a'=>'а', 'b'=>'б', 'v'=>'в', 'g'=>'г', 'd'=>'д', 'e'=>'е', 'e'=>'ё', 'zh'=>'ж', 'z'=>'з', 'i'=>'и', 'y'=>'й', 'k'=>'к', 'l'=>'л', 'm'=>'м', 'n'=>'н', 'o'=>'о', 'p'=>'п', 'r'=>'р', 's'=>'с', 't'=>'т', 'u'=>'у', 'f'=>'ф', 'h'=>'х', 'ts'=>'ц', 'ch'=>'ч', 'sh'=>'ш', 'sht'=>'щ', 'i'=>'ъ', 'y'=>'ы', 'y'=>'ь', 'e'=>'э', 'yu'=>'ю', 'ya'=>'я', 'A'=>'А', 'B'=>'Б', 'V'=>'В', 'G'=>'Г', 'D'=>'Д', 'E'=>'Е', 'E'=>'Ё', 'Zh'=>'Ж', 'Z'=>'З', 'I'=>'И', 'Y'=>'Й', 'K'=>'К', 'L'=>'Л', 'M'=>'М', 'N'=>'Н', 'O'=>'О', 'P'=>'П', 'R'=>'Р', 'S'=>'С', 'T'=>'Т', 'U'=>'У', 'F'=>'Ф', 'H'=>'Х', 'Ts'=>'Ц', 'Ch'=>'Ч', 'Sh'=>'Ш', 'Sht'=>'Щ', 'I'=>'Ъ', 'Y'=>'Ы', 'Y'=>'Ь', 'E'=>'Э', 'Yu'=>'Ю', 'Ya'=>'Я' ];

$html = '<p><b>Ovo je neki tekst</b> i ovo sigurno <notranslate>nece <p>preci</p> u cirilicu</notranslate>, hvala !</p>';

$dom = new DOMDocument;
@$dom->loadHTML('<div>' . $html . '</div>');

$xp = new DOMXPath($dom);
$textNodes = $xp->query('//text()[not(ancestor::notranslate)]');

foreach ($textNodes as $textNode) {
   $textNode->nodeValue = strtr($textNode->nodeValue, $trans);
}

$result ='';

foreach ($dom->getElementsByTagName('div')->item(0)->childNodes as $childNode) {
    $result .= $dom->saveXML($childNode);
}

echo $result;