我继承了一个可怕的网站,所以请原谅这个问题:)我们需要将任何非标准字符转换为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
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;