Как заменить пробелы внутри тегов HTML, сохраняя теги в PHP (preg_replace)? - PullRequest
2 голосов
/ 14 марта 2020

Допустим, у меня есть эта строка:

$string = '<p > ¡Esto es una prueba! < /p > <p> <strong > Prueba 123 </strong> </p> <p> <strong> < a href="https://matricom.net"> MATRICOM < / a> </ strong> </p> <p> <strong > Todas las pruebas aquí ... </strong > < /p>'

Я хочу исправить теги HTML, используя PHP (они искажены из-за пробелов) , Я пробовал несколько различных выражений регулярных выражений, которые я нашел в Интернете, таких как:

$html = trim(preg_replace('/<\s+>/', '<>', $text));

и:

$html = preg_replace('/<(.+?)(?:»| |″)(.+?)>/', '<\1\2>', $text);

Я попытка получить строковый вывод, подобный этому (пробелы удалены в передней и конечной частях тегов HTML):

'<p> ¡Esto es una prueba! </p> <p> <strong> Prueba 123 </strong> </p> <p> <strong> <a href="https://matricom.net"> MATRICOM </a> </strong> </p> <p> <strong> Todas las pruebas aquí ... </strong> </p>'

Предыстория: Google Translate имеет тенденцию добавлять случайные пробелы в результатах перевода, которые влияют на структуру HTML. Просто ищу быстрый способ очистить метки. Я два дня искал, как это сделать, и не могу найти ничего, что бы соответствовало тому, что я ищу.

Ответы [ 2 ]

1 голос
/ 14 марта 2020

В наиболее общем случае вы можете использовать preg_replace_callback решение:

$text='<p > ¡Esto es una prueba! < /p > <p> <strong > Prueba 123 </strong> </p> <p> <strong> <a href="https://matricom.net"> MATRICOM < / a> </ strong> </p> <p> <strong > Todas las pruebas aquí ... </strong > < /p>';
echo preg_replace_callback('~<[^<>]+>~u', function($m) { 
    return str_replace(' ', '', $m[0]); 
  // or,  preg_replace('~\s+~u', '', $m[0]); 
}, $text);

См. PHP demo .

Однако вы можете хочу создать шаблон, соответствующий только тем тегам, которые действительно используются в выводе Google Translate. Для тегов a, p и strong это будет выглядеть как

'~<\s*(?:/\s*)?(?:p|a|strong)\s*>~u'

См. это демонстрационное выражение регулярного выражения

Подробности

  • < - < char
  • \s* - 0+ пробелов
  • (?:/\s*)? - необязательная последовательность / и затем 0+ пробелы
  • (?:p|a|strong) - p, a или strong подстроки
  • \s* - 0+ пробелы
  • > - > char.
0 голосов
/ 15 марта 2020

Это может быть больше, чем нужно, но процесс перевода файлов HTML (будь то MT или человек) включает в себя анализ HTML через фильтр, который полностью скрывает \ защищает теги HTML от процесса перевода. , Редактор перевода разрешит перемещение определенных тегов только для целей лингвистики c (в вашем примере это может быть href). Кроме того, на некоторых языках форматирование жирным шрифтом может быть нежелательным.

После постобработки HTML остается на месте, как и при изменении только текстового содержимого.

Обратите внимание, что вы можете Найдите с помощью Google translate, что содержимое тегов HTML иногда также переводится, что вызывает у вас всевозможные проблемы.

Я могу объяснить решение более подробно, просто дайте мне знать, если это интерес. Необходимые инструменты можно получить бесплатно.

...