PHP - извлечь текст из HTML, перевести и вернуть его - PullRequest
0 голосов
/ 16 декабря 2018

Я использую API для перевода своего блога, но иногда он портится с моим html таким образом, что дает мне больше работы для исправления всего.

То, что я сейчас пытаюсь сделать, - этоИзвлеките содержимое из HTML, переведите его и положите обратно туда, где оно было.

Сначала я попытался сделать это с помощью preg_replace, где я бы заменил каждый тег на что-то вроде ## a_number ##, а затем вернул обратнок оригинальному тегу после перевода текста.К сожалению, им очень трудно управлять, потому что мне нужно заменить каждый тег уникальным значением.

Затем я попробовал его с "простым html dom", который можно найти здесь: 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.

Видите ли вы лучшие варианты для достижения этой цели?

спасибо Лорану

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Например, у меня есть следующий 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>
0 голосов
/ 16 декабря 2018
<div>
   <p>
        This text is for translating<br>
        Next line of text
   </p>
</div>

Что если вы взорвете строку html в массив, разделяющийся на «<» Это приведет к получению этого массива: </p>

Array
(
[0] => 

[1] => div>

[2] => p>
        This text is for translating
[3] => br>
        Next line of text

[4] => /p>

[5] => /div>

)

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

Когда транслирование выполнено, вы переворачиваете его, снова приклеивая элементы массива.

...