清洗属性名称

5
基于html语法文档和在验证器的试验和误差,我认为在HTML属性名称中允许使用以下字符:
  • 字母数字
  • 连字符
  • 下划线
  • 句点
例如以下内容经过验证:
<p data-éxample>
<p data-1.5>

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

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

这个方法可以处理一般字符,但是对于特殊的alpha字符会出现问题:

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

现在,有人使用这样的字符可能看起来很疯狂,但实际上确实有效,尽管CSS似乎无法验证转义或未转义
如何在PHP中实现这一点?清洁程序员应该如何编写代码以允许特殊的阿尔法字符?这是否可以通过regexp实现?为什么ctype_graph('é')是false?

你的正则表达式是正确的,应该可以工作。你能否尝试更具体地使用以下正则表达式 [^A-Za-z0-9_\-\.] - pogo
@Pogo 是的,那是同一个正则表达式。它会清除特殊的字母字符,比如 é。我很好奇是否有可能通过正则表达式或其他方式来白名单/定位特殊的字母字符。 - ryanve
1
@ryanve 尝试将 \w 替换为 \p{L}PHP 的 PCRE Unicode 文档 - Martin Ender
1个回答

5

PHP的正则表达式引擎PCRE支持Unicode字符属性,使用\p{属性}。其中之一是L,它是任何字母的属性。因此,您可以将\w替换为\p{L}0-9_

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

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

不错——这就是我说的 =] 谢谢。preg_replace 在这里起作用了。特殊的 alpha 字符显示为问号钻石,但我认为这可能与 PHP 设置有关,因为在本地 .html 文件中字符是正常显示的。 - ryanve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接