将utf8转换为Perl中的html实体

问题描述 投票:1回答:1

我继承了一个可怕的网站,所以请原谅这个问题:)我们需要将任何非标准字符转换为HTML实体,而不是将网站升级为完全UTF8:

&#ord_value;

此测试脚本为一个字符执行此操作:

$foo =~ s/(\x{ed})/to_ord($1)/e;

sub to_ord {
    return ("&#" . ord($_[0]). ";")
}

我需要做的是,在比ord 127更大的任何事情上触发这个。有一个简单的方法我能做到吗?我查看了角色类,但看不到任何符合条件的东西

FWIW,我让他们意识到他们当前存储数据的方式很糟糕,并且会导致人们尝试搜索HTML实体时出现问题 - 但这是我无法控制的。

更新:这有效,但我确信必须有更好的方法 - 所以如果你有建议请分享:)

s/([^a-z \.,-_0-9])/to_ord($1)/eg
perl
1个回答
2
投票
s/(...)/ ... /eg;

模式选择:

  • [^\x00-\x21\x23-\x25\x28-\x3B\x3D\x3F-\x7F](逃避非ASCII。)
  • [^\x09\x0A\x0D\x20-\x21\x23-\x25\x28-\x3B\x3D\x3F-\x7E](转义非ASCII和控制字符。)

选择替换表达式:

  • "&#".ord($1).";"
  • sprintf("&#x%X;", ord($1))(额外的CPU,但带宽减少。)

例如,

s/([^\x09\x0A\x0D\x20-\x21\x23-\x25\x28-\x3B\x3D\x3F-\x7E])/ sprintf("&#x%X;", ord($1)) /eg;
© www.soinside.com 2019 - 2024. All rights reserved.