清理属性名称

时间:2012-11-08 06:28:41

标签: php html regex html5 encoding

基于html syntax docs以及validator中的试错,我相信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中解决这个问题?如何编写消毒剂以允许特殊的字母字符?这可能通过regexp吗?为什么ctype_graph('é')是假的?

1 个答案:

答案 0 :(得分:4)

PHP的正则表达式引擎PCRE支持Unicode character properties \p{property}。其中一个属性是L,这是任何字母的属性。因此,您只需将\w替换为\p{L}0-9_

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

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