jtolj / html-attributes
此包已被废弃,不再维护。未建议替代包。
PHP中处理HTML属性的流畅接口。
v2.1.0
2020-10-01 14:02 UTC
Requires
- php: >=7.3
- laminas/laminas-escaper: ^2.6
Requires (Dev)
- nunomaduro/phpinsights: ^1.14
- phpunit/phpunit: ^8.4|^9.0
This package is auto-updated.
Last update: 2024-02-16 16:46:29 UTC
README
PHP中处理HTML属性的流畅接口
此包提供了一个简单的类,灵感来源于 Drupal 的 Drupal\Core\Template\Attribute,旨在帮助以结构化的方式管理 HTML 属性。
我主要在 Laravel 中使用它,因此下面的伪代码示例使用了 Laravel 习惯。然而,此包并不仅限于 Laravel,可以在没有它的环境中使用。
示例
在控制器中
use App\Post; use Jtolj\HtmlAttributes\HtmlAttributes; $post = Post::find(1); $post->is_wide = true; $attributes = new HtmlAttributes(); $attributes ->addClass('card'); ->setAttribute('id', "post-{$post->id}"); $attributes->addClassIf('card--wide', $post->is_wide); echo "<div $attributes>$post->escaped_content</div>"
输出
<div class="card card--wide" id="post-1">Hello World</div>
使用示例特质与 Eloquent 模型和 Blade 模板
namespace App; use Illuminate\Database\Eloquent\Model; use Jtolj\HtmlAttributes\Traits\HasHtmlAttributes; class Post extends Model { use HasHtmlAttributes; }
@foreach ($posts as $post) <div {!! $post->htmlAttributes()->addClass('card')->addClassIf('even', $loop->even) !!}> {{ $post->summary }} </div> @endforeach
输出
<div class="card">First Post</div> <div class="card even">Second Post</div> <div class="card">Third Post</div>
转义和过滤
使用 laminas/laminas-escaper 包执行属性名称和值的转义。属性键使用 escapeHtmlAttr() 方法进行转义。从 2.0 版本开始,属性值使用 escapeHtml() 方法进行转义。
此外,默认情况下,以 'on' 开头的属性名称(JavaScript 事件处理器)不会输出。
您可以使用 setUnsafePrefixes(array $prefixes) 方法设置您自己的前缀列表。以这些前缀开头的属性名称将在输出时被删除。
您还可以通过调用 allowUnsafe() 来关闭此行为。这将不会在输出之前过滤属性名称列表,并将 'unsafe' 属性的值完全未转义地输出(自 2.0 版本起)。请务必小心处理此行为,以防止 XSS 攻击。
use Jtolj\HtmlAttributes\HtmlAttributes; $attributes = new HtmlAttributes; $attributes->addClass('card'); $attribute->setAttribute('onclick', 'alert("Hello";)'); $safe_string = (string) $attributes; //class="card" $attributes->allowUnsafe(); $unsafe_string = (string) $attributes; //class="card" onclick="alert(\"Hello\";)"