закодировать специальный символ в HTML-сущности в Perl - PullRequest
3 голосов
/ 18 января 2012

У меня есть строка, в которой могут появляться специальные символы, такие как ! или " или & или # или @, ....Как я могу конвертировать в строку

str = " Hello "XYZ" this 'is' a test & so *n @."

автоматически каждые специальные символы с их HTML-сущностями, чтобы я получил это:

str = " Hello &quot ;XYZ&quot ; this &#39 ;is&#39 ; a test &amp ; so on @" 

Я пытался

$str=HTML::Entities::encode_entities($str);

но он выполняет частичную работу: @ не преобразуется в @

РЕШЕНИЕ:

1) с вашей помощью (Квентин и vol7ron) Iпридумал это решение (1)

$HTML::Entities::char2entity{'@'} = '@';
$HTML::Entities::char2entity{'!'} = '!';
$HTML::Entities::char2entity{'#'} = '#';
$HTML::Entities::char2entity{'%'} = '%';
$HTML::Entities::char2entity{'.'} = '.';
$HTML::Entities::char2entity{'*'} = '*';
$str=HTML::Entities::encode_entities($str, q{@"%'.&#*$^!});

2) и я нашел более короткое (лучшее) решение (2) нашел его здесь :

$str=HTML::Entities::encode_entities($str, '\W');

\ W выполняет работу

@ von7ron с решением (1), вам нужно будет указать символы, которые вы хотите перевести, как Квентин , упомянутый ранее, даже еслиони находятся на столе перевода.

Ответы [ 3 ]

4 голосов
/ 18 января 2012

@ не трансформируется, поскольку не считается «специальным символом».Он может быть представлен в ASCII и не имеет значительного значения в HTML.

Вы можете расширить диапазон символов, которые преобразуются вторым аргументом в функцию, которую вы используете, , как описано в документации .

2 голосов
/ 18 января 2012

Вы можете вручную добавить символ в таблицу перевода (хэш char2entity).

$HTML::Entities::char2entity{'@'} = '@';

my $str      =  q{ Hello "XYZ" this 'is' a test & so on @};
my $encoded  =  HTML::Entities::encode_entities( $str, q{<>&"'@} );
  1. Выше добавлено @, которое будет переведено в &#64;.
  2. Затем вам нужно указать символы, которые вы хотите перевести, если вы не используете, он использует <>&", поэтому я добавил и @, и '.Обратите внимание, мне не нужно было добавлять ' в таблицу перевода, потому что она уже есть по умолчанию.
  3. Вам не нужно добавлять символы ASCII (0-255) в хеш char2entity,так как модуль сделает это автоматически.

Примечание: Установка char2entity для @, была выполнена в качестве примера.Модуль автоматически устанавливает числовые объекты для символов ASCII (0-255), которые не были найдены.Вы должны будете использовать его для символов Юникода.

0 голосов
/ 18 января 2012

Дешево, грязно и некрасиво, но работает:

my %translations;
$translations{'"'}  = '&quot ;';
$translations{'\''} = '&#39 ;';
etc...


sub transform()
{
    my $str = shift;
    foreach my $character (keys(%translations))
    {
        $str =~ s/$character/$translations{$character}/g;
    }
    return $str;
}
...