Php 替换整页上的字母,但不替换标签内的字母
我已经找了好几天了。。但没有结果 我想使用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>Ово је неки
因此,如果我有:
<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 necepreciu 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
来替换特定的字符,但这似乎是一条漫长的路要走。