如何在Drupal 7或PHP中为锚点标签和图片标签添加target='_blank'属性
为外部HTML内容中的锚点标签添加target='_blank'属性
没问题,我来帮你搞定这个需求!首先要说明下:图片标签(<img>)本身并不支持target属性,这个属性是锚点标签(<a>)专属的,所以我们的核心是处理所有<a>标签(包括那些包裹图片的<a>),给它们加上target="_blank"。下面分别提供原生PHP和Drupal 7的实现方案:
原生PHP实现方式
推荐用DOMDocument来处理HTML,相比正则表达式,它能更可靠地解析复杂的HTML结构,避免匹配错误。具体代码如下:
<?php // 获取外部内容 $data = file_get_contents('https://example.com/live/widget/1'); // 初始化DOMDocument并加载HTML $dom = new DOMDocument(); // 禁用XML解析错误提示,避免HTML不规范时抛出警告 libxml_use_internal_errors(true); $dom->loadHTML($data); libxml_clear_errors(); // 遍历所有锚点标签,添加/覆盖target属性 $anchors = $dom->getElementsByTagName('a'); foreach ($anchors as $anchor) { // 设置target="_blank",如果已有该属性则直接覆盖 $anchor->setAttribute('target', '_blank'); // 建议同时添加rel属性提升安全性,防止钓鱼风险 $anchor->setAttribute('rel', 'noopener noreferrer'); } // 可选:提取<body>内的内容,避免DOM自动补全的外层<html><body>标签 $bodyNode = $dom->getElementsByTagName('body')->item(0); $modifiedData = ''; foreach ($bodyNode->childNodes as $child) { $modifiedData .= $dom->saveHTML($child); } // 输出修改后的内容 print_r($modifiedData); ?>
说明
libxml_use_internal_errors(true):用来屏蔽HTML解析时的警告(比如外部HTML结构不规范的情况)- 添加
rel="noopener noreferrer":这是安全最佳实践,防止新打开的页面通过window.opener篡改原页面 - 如果不需要提取body内容,直接用
$modifiedData = $dom->saveHTML()即可,只是会多一层DOM自动补全的<html>和<body>标签
Drupal 7实现方式
Drupal 7中同样可以用DOMDocument处理,同时可以结合Drupal的安全规范来优化。如果是在自定义模块里处理,代码示例如下:
<?php // 获取外部内容 $data = file_get_contents('https://example.com/live/widget/1'); // 初始化DOMDocument并加载HTML $dom = new DOMDocument(); libxml_use_internal_errors(true); $dom->loadHTML($data); libxml_clear_errors(); // 处理所有锚点标签 $anchors = $dom->getElementsByTagName('a'); foreach ($anchors as $anchor) { $anchor->setAttribute('target', '_blank'); // 遵循Drupal安全标准,添加rel属性 $anchor->setAttribute('rel', 'noopener noreferrer'); } // 提取body内的内容(可选) $bodyNode = $dom->getElementsByTagName('body')->item(0); $modifiedData = ''; foreach ($bodyNode->childNodes as $child) { $modifiedData .= $dom->saveHTML($child); } // 在Drupal中输出内容(如果是在页面回调或模板里) print $modifiedData; ?>
额外提示
如果你的需求是在Drupal的某个字段或区块里处理这类内容,也可以自定义一个文本过滤器:
- 新建自定义模块
- 实现
hook_filter_info()注册一个过滤器 - 在过滤器的处理函数里使用上面的DOM逻辑来修改HTML内容
内容的提问来源于stack exchange,提问作者miststudent2011
相关产品推荐
相关产品推荐

