首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据当前HTML生活标准,HTML 5属性正则表达式的验证器和消毒器

根据当前HTML生活标准,HTML 5属性正则表达式的验证器和消毒器
EN

Code Review用户
提问于 2021-02-26 12:05:50
回答 1查看 58关注 0票数 2

根据https://html.spec.whatwg.org/multipage/syntax.html#attributes-2,HTML5属性名的定义如下:

属性名必须包含一个或多个字符,而不是控件、U+0020空间、U+0022 (")、U+0027 (')、U+003E (>)、U+002F (/)、U+003D (=)和非字符。

创建一个类,它可以处理或清理HTML 5属性名,我最后得到了以下代码-特别是下面的regex:

代码语言:javascript
运行
复制
class AttributeNameValidator
{
    public const ATTRIBUTE_NAME_MATCHER = "/[\s\x{0000}\x{0020}\x{0022}\x{0027}\x{003E}\x{002F}\x{003D}\x{200B}-\x{200D}\x{FDD0}-\x{FDEF}\x{FEFF}[:cntrl:]]+/u";

    /**
     * Checks if a given string is a valid HTML attribute name.
     * @param string $attributeName
     * @return bool: True if the given attribute name is a valid HTML attribute name.
     */
    public static function isAttributeNameValid(string $attributeName): bool
    {
        return (bool)preg_match(self::ATTRIBUTE_NAME_MATCHER, $attributeName);
    }

    /**
     * Sanitizes a string to be a valid HTML5 attribute name.
     * @param string $attributeName
     * @return string
     * @throws NonSanitizeableException
     */
    public static function sanitizeAttributeName(string $attributeName): string
    {
        $sanitizedAttributeName = preg_replace(self::ATTRIBUTE_NAME_MATCHER, '', $attributeName);
        if(!$sanitizedAttributeName) {
            throw new NonSanitizeableException("Failed to sanitize attribute name");
        }
        return $sanitizedAttributeName;
    }
}

我的手动测试似乎很好,但我不确定正则表达式是否完全符合标准,或者我是否忘记了什么。还有什么需要改进的吗?

EN

回答 1

Code Review用户

回答已采纳

发布于 2021-02-26 14:24:16

  • \x{0020} (空格)字符已经包含在\s中,可以省略该部分。
  • 为了一致性,我更喜欢使用\p{Cc}而不是[:cntrl:],因为我不喜欢在字符类中嵌套正方形大括号。
  • 我希望isAttributeNameValid()检查整个字符串是否包含黑名单中的字符。如果要匹配整个字符串,则需要“字符串的开始”和“字符串的结束”锚点和模式中的一个负值字符类。但是等等,如果字符串中有一个或多个黑名单字符,那么您将返回一个常规字符类,并且返回true --这似乎与方法名的含义正好相反。除非我感到困惑,否则您应该将(bool)替换为!,以便在匹配时返回false,在没有黑名单字符时返回true
  • 我不知道我是否同意Failed to sanitize attribute name的措辞;说Attribute name had no salvagable characters似乎更真实。
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/256470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档