Как я могу заменить все HTML-кодированные акценты в Perl? - PullRequest
4 голосов
/ 28 января 2009

У меня следующая ситуация:

Существует инструмент, который получает XSLT из веб-интерфейса и встраивает XSLT в файл XML (кто-то должен был быть запущен). «К сожалению» я работаю во франкоязычной стране, и поэтому в XSLT есть несколько слов с ударениями. Когда XSLT встроен в XML, инструмент преобразует все акценты в их HTML-коды (Iacute, igrave и т. Д.).

Мой код Perl извлекает XSLT из XML и выполняет его для другого XML с помощью инструмента командной строки Xalan. Каждый раз, когда в XSLT появляется какой-то акцент, инструмент Xalan создает исключение.

Сначала я хотел сделать регулярное выражение, чтобы изменить все акценты в XSLT-usch следующим образом:

# the & is omitted in the codes becuase it will be rendered in the page
$xslt =~s/Aacute;/Á/gso;
$xslt =~s/aacute;/á/gso;
$xslt =~s/Agrave;/À/gso;
$xslt =~s/Acirc;/Â/gso;
$xslt =~s/agrave;/à/gso;

но это означает, что я должен написать регулярное выражение для каждого из кодов ударения ...

У меня вопрос: есть ли в любом случае сделать это без написания регулярного выражения для кода? (думая, что это единственное решение, хочется рвать.)

Кстати, инструмент TeamSite, и он отстой .....

Отредактировано: Я забыл упомянуть, что мне нужно иметь решение только для Perl, безопасность не позволяет мне устанавливать какие-либо типы библиотек, которые они не проверяли в течение недели или около того: (

Ответы [ 4 ]

6 голосов
/ 28 января 2009

Вы можете попробовать что-то вроде HTML :: Entities . Из POD:

use HTML::Entities;
$a = "Våre norske tegn bør &#230res";
decode_entities($a);
#encode_entities($a, "\200-\377");  ## not needed for what you are doing

В ответ на ваши изменения HTML :: Entities не в ядре perl. Он все еще может быть установлен в вашей системе, потому что он используется многими другими библиотеками. Вы можете проверить, выполнив эту команду:

perl -MHTML::Entities -le 'print "If this prints, the it is installed"'
1 голос
/ 28 января 2009

Для вашей цели HTML :: Entities гораздо лучшее решение, но если вы не найдете какой-либо существующий пакет, соответствующий вашим потребностям, следующий подход более эффективен, чем множественные s/// операторы

# this part do in inter function module code which is executed in compile time
# or place in BEGIN or do once before first s/// statement using it
my %trans = (
  'Aacute;' => 'Á',
  'aacute;' => 'á',
  'Agrave;' => 'À',
  'Acirc;' => 'Â',
  'agrave;' => 'à',
); # remember you can generate parts of this hash for example by map

my $re = qr/${ \(join'|', map quotemeta, keys %trans)}/;

# this code place in your functions or methods
s/($re)/$trans{$1}/g; # 'o' is almost useless here because $re has been compiled yet

Редактировать : Нет необходимости в e модификаторе регулярного выражения, как указано Час. Owens .

0 голосов
/ 29 января 2009

Почему кто-то должен быть уволен за помещение XSL, то есть XML, в файл XML?

0 голосов
/ 28 января 2009

Не думаю, что TeamSite можно оставить как utf-8 / преобразовать в utf-8?

CGI.pm имеет (недокументированную) функцию unescapeHTML. Однако, поскольку он недокументирован (и я не просматривал источник), я не знаю, обрабатывает ли он только основные сущности HTML (<,>, &) или более. Тем не менее, я бы догадался, что он делает только основные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...