извлечь текст из HTML, перевести и вернуть его

Я использую 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

0

Решение

Например, у меня есть следующий 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>
1

Другие решения

<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>

)

Затем разбейте каждый элемент массива на «>». Первым элементом в этом массиве является тег. Любой другой элемент, если таковой имеется, будет контентом для перевода.

Когда перевод завершен, вы обращаетесь к нему, снова приклеивая элементы массива.

1

По вопросам рекламы [email protected]