使用合法 DOM 解析函数可靠地改变有效 html 的新答案:
- 迭代所有 iframe 标记。
- 使用现有的
src 属性插入新的data-src 属性。
- 删除旧的
src 属性。
- 打印更新后的 DOM。
正如@user706420 所述,从<iframe> 标记中删除src 属性是一个错误的决定,因为它会使html 无效。我的回答是关于如何执行标签属性替换的示范,但我同意@user706420 的观点,认为这个任务在逻辑上确实存在缺陷。
代码:(Demo)
$html = <<<HTML
<p>Some random text <iframe src="the link"" width="425" height="350" frameborder="0"></iframe></p>
HTML;
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
foreach ($dom->getElementsByTagName('iframe') as $iframe) {
$iframe->setAttribute('data-src', $iframe->getAttribute('src'));
$iframe->removeAttribute('src');
}
echo $dom->saveHTML();
输出:
<p>Some random text <iframe width="425" height="350" frameborder="0" data-src="the link"></iframe></p>
旧答案(于 2020 年 10 月 9 日改进)建议我不再认可,因为正则表达式是“DOM-ignorant”...
匹配<iframe 的开头和开始标记中的所有字符,直到遇到一个空格字符,然后紧跟子字符串src= - 这确保目标src= 子字符串没有任何前面的非空白字符(IOW,它是一个完整/单独的单词)。
必须释放/忘记空格之前的子字符串——这就是\K 所做的。该空间将需要被消耗并替换为 data-。
代码:(Demo)
$content = 'Some text that contains src <iframe src="www.example.com"/> Some text';
echo preg_replace('~<iframe[^>]*\K (?=src=)~i', ' data-', $content);
输出:
Some text that contains src <iframe data-src="www.example.com"/> Some text
虽然我改进了正则表达式,但可以看到故意编写有效的 html 字符串来破坏正则表达式,例如:<iframe src="www.example.com"/ data-type="<iframe" data-whoops=" src= oh my"> 因此,我只建议使用 dom 解析器解析 html。