Из вашего примера кода вы, вероятно, только что внедрили атаку межсайтового скриптинга в свое приложение.Если бы я заставил ваш код обрабатывать что-то вроде <script src="evil.example.com"></script>
, ваш код декодировал бы его в действительный HTML, а не перекодировал бы <
и >
обратно в сущности.(Угловые скобки в коде не являются угловыми скобками ASCII.)
Если вы усекаете строку, содержащую какие-либо HTML-теги или объекты, вы, вероятно, что-то сломаете, если будете использовать простое решение.Возможно, вам лучше создать решение, основанное на модуле парсинга HTML.Если вы смотрите только на текст внутри элемента, в котором нет элементов, вы можете захватить текст, обрезать его и затем вернуть обратно в элемент.Если вам придется иметь дело со смешанным контентом, это будет сложнее.
Но в интересах плохих решений:
#treats each entity as one character "2 < 4" is 5 characters long
$trunc_len = $len - 3;
$str =~ s/^((?>(?:[^&]|&[^\s;]+;?){$trunc_len}))(?:[^&]|&[^\s;]+;?){4,}/$1.../;
#abuses proceadural nature of the regexp engine
#treats each input character as on character "2 < 4" is 8 characters long
$str =~ s/^( (?:[^&]|&[^\s;]+;?)+ )(?(?{ $found = (pos() > ( $found ? $len - 3 : $len ))})(?!)).*$(?(?{pos() < $len })(?!))/$1.../x;
И то, и другое является довольно допустимым в том, что является сущностью, допускающей общие странные особенности браузера.