【问题标题】:Sanitize Attribute Name清理属性名称
【发布时间】:2012-10-28 08:01:13
【问题描述】:

基于html syntax docsvalidator中的反复试验,我认为HTML属性名称中允许的字符是:

  • 字母数字
  • 连字符
  • 下划线
  • 周期

例如这些验证

<p data-éxample>
<p data-1.5>

我想编写一个清理属性名称的函数:

<?php 
function sanitize_attr_name ( $name ) {
    return is_string($name) ? preg_replace( '/[^\w\-\.]/', '', $name ) : '';
}

除了特殊的字母字符外,这都有效:

sanitize_attr_name( 'data-éxample' ); // 'data-xample'

现在有人使用这样的字符可能看起来很疯狂,但 does in fact work 尽管 css 似乎无法验证 escaped or not

如何在 PHP 中实现这一点?如何编写消毒剂以允许特殊的字母字符?这可能通过正则表达式吗?为什么ctype_graph('é') 是假的?

【问题讨论】:

  • 您的正则表达式是正确的,应该可以工作。您可以尝试更具体并使用以下正则表达式[^A-Za-z0-9_\-\.]
  • @Pogo 是的,这是同一个正则表达式。它消除了特殊的 alpha 字符,例如 é。我很想知道是否可以通过正则表达式或其他方式将特殊 alpha 字符列入白名单/目标。
  • @ryanve 尝试用\p{L} 替换\wPHP'S PCRE Unicode documentation

标签: php regex html encoding


【解决方案1】:

PHP 的正则表达式引擎 PCRE 支持 Unicode character properties\p{property}。其中一个属性是L,它是any 字母的属性。所以你可以用\p{L}0-9_替换\w

'/[^\p{L}0-9_.-]/'

在字符类中也不需要转义句号,连字符可以放在末尾以避免转义。

【讨论】:

  • 很好——这就是我所说的回合 =] 谢谢。 preg_replace 与它一起工作。特殊的 alpha 字符显示为问号菱形,但我认为这与字符显示的本地 .html 文件中的 PHP 设置 b/c 有关。
猜你喜欢
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2017-08-05
  • 2017-06-15
  • 2011-05-04
  • 2016-10-02
相关资源
最近更新 更多