基于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('é')
是假的?
答案 0 :(得分:4)
PHP的正则表达式引擎PCRE支持Unicode character properties \p{property}
。其中一个属性是L
,这是任何字母的属性。因此,您只需将\w
替换为\p{L}0-9_
:
'/[^\p{L}0-9_.-]/'
也不需要在字符类中转义句点,并且可以在末尾放置连字符以避免转义。