Я использую API для перевода своего блога, но иногда он портится с моим html таким образом, что дает мне больше работы, чтобы все исправить.
То, что я сейчас пытаюсь сделать, это извлечь контент из HTML, перевести его и вернуть его туда, где он был.
Сначала я попытался сделать это с помощью preg_replace, где я заменил бы каждый тег на что-то вроде ## a_number ##, а затем вернулся к исходному тегу после перевода текста. К сожалению, это очень сложно, потому что мне нужно заменить каждый тег уникальным значением.
Затем я попробовал это с «простой HTML-дом», который можно найти здесь:
http://simplehtmldom.sourceforge.net/manual.htm
$html = str_get_html($content);
$str = $html;
$ret = $html->find('div');
foreach ($ret as $key=>$value)
{
echo $value;
}
Таким образом, я получаю все тексты, но в значении все еще есть html (div внутри div), и я не знаю, как вернуть обратно переведенный текст в исходный объект. Структура этого объекта настолько сложна, что при его отображении происходит сбой моего браузера.
У меня немного не хватает вариантов, и, возможно, есть более простые способы сделать это. То, что я хотел бы найти, — это способ получить объект или массив, содержащий все html с одной стороны и весь текст с другой стороны. Я перебрал бы текст, чтобы перевести его и объединить все, чтобы не нарушать HTML.
Видите ли вы лучшие варианты для достижения этой цели?
Спасибо
Laurent
Например, у меня есть следующий HTML, где все слова в нижнем регистре:
<div>
<h2>page not found!</h2>
<p>go to <a href="/">home page</a> or use the <a href="/search">search</a>.</p>
</div>
Моя задача — преобразовать текст в заглавные слова. Чтобы решить эту проблему, я выбираю все текстовые узлы и конвертирую их, используя ucwords
функция (конечно, вы должны использовать свою функцию перевода вместо нее).
libxml_use_internal_errors(true);
$dom = new DomDocument();
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//text()') as $text) {
if (trim($text->nodeValue)) {
$text->nodeValue = ucwords($text->nodeValue);
}
}
echo $dom->saveHTML();
Выше приведено следующее:
<div>
<h2>Page Not Found!</h2>
<p>Go To <a href="/">Home Page</a> Or Use The <a href="/search">Search</a>.</p>
</div>
<div>
<p>
This text is for translating<br>
Next line of text
</p>
</div>
Что делать, если вы взорвете строку html в массив, разделяющийся на «<«Это приведет к этому массиву:
Array
(
[0] =>
[1] => div>
[2] => p>
This text is for translating
[3] => br>
Next line of text
[4] => /p>
[5] => /div>
)
Затем разбейте каждый элемент массива на «>». Первым элементом в этом массиве является тег. Любой другой элемент, если таковой имеется, будет контентом для перевода.
Когда перевод завершен, вы обращаетесь к нему, снова приклеивая элементы массива.