【问题标题】:PHP check if it is a valid HTML attributePHP 检查它是否是一个有效的 HTML 属性
【发布时间】:2019-09-18 19:30:34
【问题描述】:

我想检查给定的字符串是否可以是有效的 HTML 属性。如果不是这种情况,我会将前缀为data- 的字符串添加到元素中。我该怎么办?

例如,当用户想要添加一个属性时,它会将其传递给$attributes 数组,如下所示:

    $attr = '';
    foreach ( $attributes as $key => $value ) {
        if (is_attr($key)) {
            $attr .= $key . '="' . $value . '" ';
        } else {
            $attr .= 'data-' . $key . '="' . $value . '" ';
        }
    }

所以这最终会被添加到一个表单元素中,比如inputtextarea 或类似的东西。

...is_attr($key) 的实现会是什么样子?

更新: 我希望我可以使用 DomDocument() 类创建属性,然后验证它以查看该属性是否受到官方支持。到目前为止没有运气。

【问题讨论】:

  • 您可以查看this answer(cmets 中也有一个很好的正则表达式),也可以查看this MDN list,但请注意,文件列表可能会随着新规范而改变。另请注意,如果字符有效,您可以将任何属性设置为元素,即使不原生用作标记参数,该属性也会存在。
  • "is_attr($key) 的实现会是什么样子?" — 一开始需要多个属性。 HTML 规则包括诸如“输入元素可能具有 multiple 属性,但前提是它具有 type="file"。HTML 验证复杂 ...太复杂了,无法在 stackoverflow 答案中编写完整的解决方案。 (投票结束过于广泛)。

标签: php html dom


【解决方案1】:

这里是is_attr 函数,用于检查输入或文本区域的有效属性。

function is_attr($attr, $elementType)
{
    $input       = ["autocomplete", "autofocus", "disabled", "list", "name", "readonly", "required", "tabindex", "type", "value"];
    $globalAttrs = ["accesskey", "class", "contenteditable", "contextmenu", "dir", "draggable", "dropzone", "id", "lang", "style", "tabindex", "title", "inputmode", "is", "itemid", "itemprop", "itemref", "itemscope", "itemtype", "lang", "slot", "spellcheck", "translate"];
    $select      = ["autofocus", "disabled", "form", "multiple", "name", "required", "size"];
    $textarea    = ["autocapitalize", "autocomplete", "autofocus", "cols", "disabled", "form", "maxlength", "minlength", "name", "placeholder", "readonly", "required", "rows", "spellcheck", "wrap"];
    return (in_array($attr, $globalAttrs) || in_array($attr, $$elementType));
}
echo is_attr('accesskey','select');

我已经从官方htmldoc中获取了所有有效属性。

【讨论】:

  • 并非所有这些在输入 textarea ... 上都有效
  • "我已从官方 html 文档中获取所有有效属性。" — 您链接到的文档不是远程“官方”
  • 你错过了data-*idclass(可能还有其他一些东西,但他们跳出来攻击我)。
  • 重新编辑:data-* 仍然丢失,您链接到的文档仍然不是官方文档,并且您错过了输入元素有条件允许的一堆属性。跨度>
  • 您好@Quentin 先生,我在文档中看到了这一点,但这是 OP 的特例。他想用data- 替换无效的属性,这就是为什么我没有将它包含在我的数组中。我希望你能得到我的关心。
猜你喜欢
  • 2011-04-07
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多