我一直在寻找这个......但没有结果。
我想使用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>
如何使用正则表达式执行此操作?
答案 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;