DOMDocument 从标记中删除侦听器

DOMDocument remove listeners from tags

提问人:André Rodrigues 提问时间:8/23/2023 最后编辑:André Rodrigues 更新时间:8/23/2023 访问量:40

问:

我将 DOMDocument 与使用 Framework/Lib 并具有事件侦听器的 HTML 一起使用,但只是忽略了具有“AT=@”的属性:

$html = '<button @click="test()">ÁÈ</button>';
$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $html);
dump($dom);

// Expected to happen - <button @click="test()">ÁÈ</button>
// Actually resulted  - <button>ÁÈ</button>

请注意,由于 DOMDocument,已从字符串中删除。@click="test()"

php dom文档

评论

2赞 Professor Abronsius 8/23/2023
上面的 HTML 中有什么巫毒教?这是来自某种框架,因为它不是有效的 HTML@click
0赞 André Rodrigues 8/23/2023
是的。我正在使用 AlpineJS,但我做了一个技巧,为所有人提供了str_replace。@
0赞 nice_dev 8/23/2023
@AndréRodrigues 那么它完成了吗?
1赞 Olivier 8/23/2023
如果删除,则会得到 ,这清楚地表明这是不允许的。libxml_use_internal_errors(true);error parsing attribute name@
0赞 André Rodrigues 8/23/2023
@nice_dev 是的,但我不知道这是否是正确的方法哈哈哈

答:

2赞 nice_dev 8/23/2023 #1

您需要删除所有带有前缀的事件侦听器,为此,您可以使用 preg_replace 来执行此操作。在正则表达式组编号的帮助下进行替换时,取回事件侦听器的名称。@

<?php

$html = '<button @click="test()">ÁÈ</button>';

$html = preg_replace('/@([a-z]+)\=/i', '$1=', $html);

echo $html;

// rest of your code 

/*

$dom = new DOMDocument();
libxml_use_internal_errors(true);
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $html);

*/

现场演示

评论

1赞 André Rodrigues 8/23/2023
多谢!我只是在前面增加一个前缀,例如:。因此,我可以找到切换回事件侦听器的位置。$1='tmp_at_event_listener_$1='@
0赞 nice_dev 8/23/2023
@AndréRodrigues 当然,一旦解决方案到位,您就可以自由地挑选和调整东西。
0赞 André Rodrigues 8/23/2023
利用这个疑问,我正在考虑性能,我认为把它放在 DOMDocument 中对我来说没有意义,为此preg_replace做一个 foreach,我是否可以在已经包含我的 HTML 的字符串中使用 preg_replace?示例:从所有 img 标签附加 src?
0赞 nice_dev 8/24/2023
@AndréRodrigues 你能编辑你的帖子并举个例子吗?到目前为止,我很难理解。