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

Php 替换整页上的字母,但不替换标签内的字母,php,regex,Php,Regex,我已经找了好几天了。。但没有结果 我想使用php将拉丁字母替换为西里尔字母。但是我想排除特定标记中的一些单词和字母 因此,如果我有: <p><b>Ovo je neki tekst</b> i ovo sigurno <notranslate>nece preci u cirilicu</translate>, hvala !</p> hvala 我希望它成为: <p><b>Ово је неки

我已经找了好几天了。。但没有结果

我想使用php将拉丁字母替换为西里尔字母。但是我想排除特定标记中的一些单词和字母

因此,如果我有:

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

我希望它成为:

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


如何使用regex执行此操作?

您的问题中有两个问题:

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

2) 如何保存“NotTranslate”标签之间的零件

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

第二个问题很容易解决,使用XPath查询只选择没有标记“NotTranslate”作为祖先的文本节点

$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;
$trans=“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“a”方的“b”方的“b”方的“b”方的“b”方的“方”方的“方”方的“方”方的“方”方的“方”方”方的“方的“方”方的“方”方”方的“方”方“方”方”方的“方“方”方“方”方“方”方”方“方”方”方”方“方“方”方”方“方“方”方”方“方”方“方“方”方“方”方”方”方“方“方”方”的“方”方“方”方”方“方ц、ts、ch、sh、sht、i、y、y、y、y、e、,“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的“你们们”的”的“你们们”的“你们们”的“你们们”的“你们们”的”的“你们们”的”的“A”的”的“A”的“A”的“A”的”的”的“A”的”的“A”的“A”的“A”的“A”的”的“A”的“A”的“A”的“A”的”的“A”的”的“A”的”的”的“A”的”的“A”的“A”的”的“A”的“A”的“A”的”的“A”的”的“A”的”的”的“A”的”的“AУ、F'=>'Ф、'H'=>'Ф、'Ts'=>'Ч、'Ch'=>'Ч、'Sh'=>'Щ、'Sht'=>'Щ、'I'=>'Ъ、'Y'=>'Ъ',‘Y’=>‘а’、‘E’=>‘Ю’、‘Yu’=>‘Ю’、‘雅’=>‘Я’];
$html=“Ovo je neki tekst i Ovo sigurno necepreci

u cirilicu,hvala!

”; $dom=新的DOMDocument; @$dom->loadHTML('.$html'.'); $xp=新的DOMXPath($dom); $textNodes=$xp->query('//text()[not(祖先::nottranslate)]); foreach($textNodes作为$textNode){ $textNode->nodeValue=strtrt($textNode->nodeValue,$trans); } $result=''; foreach($dom->getElementsByTagName('div')->item(0)->childNodes作为$childNode){ $result.=$dom->saveXML($childNode); } 回声$结果;
我不知道你可以用正则表达式来做这件事。你可以用
str\u replace
来替换特定的字符,但这似乎是一条漫长的路要走。