2012-01-18 1 views
3

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

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) я пришел с этим решением (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) нашел его here:

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

символ '\ W' делает работу

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

+0

Я уже упоминал, что это был мой второй пункт, который я сделал: «Затем вам нужно указать символ, который вы хотите перевести, если вы его не используете« <> & », поэтому я добавил оба параметра« @ 'и'. 'Если вы ничего не указываете в списке, он использует' <> * "' по умолчанию, если вы перечислите что-нибудь еще, оно не будет добавляться по умолчанию, оно заменяет его, поэтому, если вы хотите, чтобы символы по умолчанию тоже , вы должны включить в свой список, что я вам показал. – vol7ron

+0

Кстати, вам не нужны все эти '$ HTML :: Entities :: char2entity {...}' строки, и если вы это сделали, это не правильный способ его использования. Вам нужны только их, если вы собираетесь вводить символы, отличные от ASCII. «\ W» была хорошей находкой - единственным специальным (не-алфавитно-цифровым) символом, который не сможет избежать этого решения, - это подчеркивание ('_'), но это не является большой проблемой. – vol7ron

ответ

2

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

$HTML::Entities::char2entity{'@'} = '&#64;'; 

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), которые не были найдены. Однако вам придется использовать его для символов Unicode.

+1

Я получаю тот же результат " ; Hello " ; XYZ " ; это 'is' a test & ; so on @ " ; @ и 'не закодированы $ str = HTML :: Entities :: encode_entities ($ str, q {<> & " @ '#%!}) – mamesaye

+0

@mamasaye: Попробуйте 'q {<> &"' @! #} 'Порядок одиночной кавычки может испортить результат - не знаю, почему это (я не думаю '@ '' является переменной), это может быть ошибка внутреннего модуля (или, возможно, perl) - я обновил решение – vol7ron

4

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

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

+0

... который работает. '# perl -MHTML :: Entities -E'my $ str =" \ @ "; $ str = HTML :: Entities :: encode_entities ($ str, "@ #%! &"); say $ str; 'выходы' @ ' – Quentin

+0

Я попробовал' code'
$ str = HTML :: Entities :: encode_entities ($ str , '@ #%! &');
'code'and i get'code'
" Hello "XYZ" this' is 'a test & ; so on @ ; "
" code'now его игнорирование "или", которые являются объектами html. что я делаю неправильно? – mamesaye

+0

@mamesaye - аргумент ** изменяет ** символы для кодирования, он не добавляет к ним – Quentin

-1

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

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; 
} 
+1

OP имеет pe чтобы сделать это уже. Переосмысление колес обычно не является хорошей идеей. – Quentin

Смежные вопросы