HTMLPurifier 剥离 YouTube
HTMLPurifier stripping out YouTube
我一直在尝试将 HTMLPurifier 配置为接受 iframe
用于 YouTube 和 Vimeo,但无济于事。许多与此相关的帖子似乎已经过时 and/or 多年,根本不起作用。我能得到的最接近的是保留 iframe
但 src
被剥离。
这是我目前拥有的(iframe
在输出中被删除)。我意识到这个问题已被问过无数次,但对我没有任何帮助。提前致谢!
更新
我还尝试了 mewebstudio/Purifier
、https://github.com/mewebstudio/Purifier,它甚至具有 YouTube 的默认配置设置。 iframe 仍在被剥离。我错过了什么?
// HTMLPurifier
$config = \HTMLPurifier_Config::createDefault();
$config->set('HTML.Doctype', 'HTML 4.01 Transitional');
$config->set('AutoFormat.RemoveEmpty.Predicate', [
'colgroup' =>
[],
'th' =>
[],
'td' =>
[],
'o:p' =>
[]
]);
$config->set('AutoFormat.RemoveEmpty', true);
$config->set('AutoFormat.RemoveEmpty.RemoveNbsp', true);
$config->set('HTML.Allowed', 'p,span[style|class],a[href|title],abbr[title],acronym[title],b,strong,blockquote[cite],code,em,i,iframe[src|width|height],img[alt|title|class|src|height|width],h1,h2,h3,h3,ol,ul,li,table[class|style],tr,td,hr');
$config->set('HTML.SafeIframe', true);
$config->set('URI.SafeIframeRegexp', '%^(\/\/www\.youtube(?:-nocookie)?\.com\/embed\/|\/\/player\.vimeo\.com\/)%');
$def = $config->getHTMLDefinition(true);
$def->addAttribute('iframe', 'allowfullscreen', 'Bool');
$purifier = new \HTMLPurifier($config);
$input['body'] = $purifier->purify($input['body']);
我的原始代码有两个问题。首先,正则表达式无效 - 它没有说明 http:
。已替换为 '%^(https?:)?(\/\/www\.youtube(?:-nocookie)?\.com\/embed\/|\/\/player\.vimeo\.com\/)%'
其次,$config->set('AutoFormat.RemoveEmpty', true);
似乎要删除 iframe
(这是有道理的)。添加以下内容修复此问题:
$config->set('AutoFormat.RemoveEmpty.Predicate', [
'iframe' =>
array (
0 => 'src',
)
]);
感谢Edward Yang的帮助!
我一直在尝试将 HTMLPurifier 配置为接受 iframe
用于 YouTube 和 Vimeo,但无济于事。许多与此相关的帖子似乎已经过时 and/or 多年,根本不起作用。我能得到的最接近的是保留 iframe
但 src
被剥离。
这是我目前拥有的(iframe
在输出中被删除)。我意识到这个问题已被问过无数次,但对我没有任何帮助。提前致谢!
更新
我还尝试了 mewebstudio/Purifier
、https://github.com/mewebstudio/Purifier,它甚至具有 YouTube 的默认配置设置。 iframe 仍在被剥离。我错过了什么?
// HTMLPurifier
$config = \HTMLPurifier_Config::createDefault();
$config->set('HTML.Doctype', 'HTML 4.01 Transitional');
$config->set('AutoFormat.RemoveEmpty.Predicate', [
'colgroup' =>
[],
'th' =>
[],
'td' =>
[],
'o:p' =>
[]
]);
$config->set('AutoFormat.RemoveEmpty', true);
$config->set('AutoFormat.RemoveEmpty.RemoveNbsp', true);
$config->set('HTML.Allowed', 'p,span[style|class],a[href|title],abbr[title],acronym[title],b,strong,blockquote[cite],code,em,i,iframe[src|width|height],img[alt|title|class|src|height|width],h1,h2,h3,h3,ol,ul,li,table[class|style],tr,td,hr');
$config->set('HTML.SafeIframe', true);
$config->set('URI.SafeIframeRegexp', '%^(\/\/www\.youtube(?:-nocookie)?\.com\/embed\/|\/\/player\.vimeo\.com\/)%');
$def = $config->getHTMLDefinition(true);
$def->addAttribute('iframe', 'allowfullscreen', 'Bool');
$purifier = new \HTMLPurifier($config);
$input['body'] = $purifier->purify($input['body']);
我的原始代码有两个问题。首先,正则表达式无效 - 它没有说明 http:
。已替换为 '%^(https?:)?(\/\/www\.youtube(?:-nocookie)?\.com\/embed\/|\/\/player\.vimeo\.com\/)%'
其次,$config->set('AutoFormat.RemoveEmpty', true);
似乎要删除 iframe
(这是有道理的)。添加以下内容修复此问题:
$config->set('AutoFormat.RemoveEmpty.Predicate', [
'iframe' =>
array (
0 => 'src',
)
]);
感谢Edward Yang的帮助!