如何过滤织梦采集中的a标签?

99ANYc3cd6
预计阅读时长 11 分钟
位置: 首页 织梦建站 正文

过滤”规则(最简单、推荐首选)

这是织梦采集内置的功能,专门用于处理这类简单替换,无需修改代码,是最安全、最便捷的方法。

操作步骤:

  1. 登录织梦后台,进入“采集” -> “采集管理”。

  2. 找到你想要修改的采集规则,点击后面的“修改”按钮。

  3. 在规则编辑页面,滚动到最底部,找到“内容过滤”设置区域。

  4. 过滤”的文本框中,输入以下正则表达式:

    <a[^>]*>(.*?)</a>

    代码解释:

    • <a:匹配 <a 标签的开始。
    • [^>]*:匹配 > 之前的所有字符,即 a 标签的所有属性(如 href, title, target 等)。
    • 这是一个捕获组,匹配 <a></a> 之间的所有内容(即链接的文本),这部分内容我们希望保留
    • </a>:匹配 a 标签的结束。
  5. 关键一步:选择过滤方式。

    • 过滤”文本框下方,通常有一个“替换为”的输入框。这里留空即可
    • 然后在“过滤方式”或类似的下拉菜单中,选择“替换”或“正则替换”。
    • 这样做的效果是:将匹配到的整个 <a>...</a> 结构替换为空(即删除),但因为我们使用了捕获组 ,织梦在执行替换时,默认会保留捕获组里的内容
  6. 点击“保存”按钮。

效果:<a href="https://example.com" target="_blank">这是一个外部链接</a>,请点击访问,``这是一个外部链接,请点击访问。


修改采集入库处理函数(更彻底、一劳永逸)

如果你希望这个过滤效果对所有使用此规则的采集都生效,并且不想每次修改规则都去设置内容过滤,可以修改织梦的核心处理函数,这个方法会修改系统文件,请务必先备份文件

操作步骤:

  1. 备份文件:找到并备份 include/dedecollection.class.php 文件。

  2. 编辑文件:用文本编辑器(如 Notepad++、VS Code)打开 include/dedecollection.class.php 文件。

  3. 定位代码:在文件中搜索 function RunHtml,你会找到处理文章内容的函数。

  4. 添加过滤代码:在 function RunHtml 函数内部,找到处理完文章内容(通常是一个名为 $this->SplitValue 的变量)之后,但在返回结果之前,添加以下代码:

    // 在 return $this->SplitValue; 这行代码之前添加
    /**
     * 过滤掉内容中的所有a标签,但保留a标签内的文本
     * 使用正则表达式替换
     */
    $this->SplitValue = preg_replace('/<a\s+.*?>.*?<\/a>/si', '', $this->SplitValue);
    // 更精确的写法,与方法一的正则类似,可以保留标签内的文本
    // $this->SplitValue = preg_replace('/<a\s+[^>]*>([^<]*)<\/a>/i', '$1', $this->SplitValue);

    代码解释:

    • preg_replace:PHP的正则替换函数。
    • /<a\s+.*?>.*?<\/a>/si:这个正则表达式会匹配整个 <a> 标签及其所有内容。
      • <a\s+:匹配 <a 后面跟至少一个空白字符(href等属性)。
      • .*?>:非贪婪匹配,直到遇到第一个 >
      • 非贪婪匹配标签内的所有内容。
      • <\/a>:匹配 </a>
      • /sis模式使 可以匹配换行符,i模式使匹配不区分大小写。
    • 将匹配到的内容替换为空字符串,即直接删除。
  5. 保存文件:保存对 dedecollection.class.php 的修改。

效果: 从此以后,所有通过这个采集类处理的文章内容,在入库前都会自动移除 <a> 标签,这是最一劳永逸的方法。


使用“自定义处理”PHP代码(最灵活、功能最强)

如果你的需求更复杂,比如只想过滤某些特定网站来源的 <a> 标签,或者在过滤的同时需要做其他处理,可以使用这个方法。

操作步骤:

  1. 修改采集规则:在采集规则编辑页面,找到“自定义处理”部分。

  2. 编写PHP代码:在文本框中输入自定义的PHP代码,这段代码会在文章内容入库前执行。

    // 自定义处理函数,过滤a标签
    $this->SplitValue = preg_replace('/<a\s+[^>]*>(.*?)<\/a>/is', '', $this->SplitValue);
    // 如果想保留a标签内的文字,可以使用下面这行
    // $this->SplitValue = preg_replace('/<a\s+[^>]*>(.*?)<\/a>/is', '$1', $this->SplitValue);
  3. 保存规则:保存采集规则。

效果: 效果与方法二类似,但代码只针对当前这个采集规则生效,灵活性更高,适合特殊场景。


总结与建议

方法 优点 缺点 适用场景
内容过滤 简单、安全、不修改核心文件,可视化操作。 每个规则都需要单独设置,规则多时稍显繁琐。 绝大多数情况下的首选,适合所有用户。
修改核心函数 一劳永逸,对所有采集规则生效,效率高。 需要修改核心文件,有升级被覆盖的风险,对新手不友好。 网站管理员,希望永久性解决此问题,且不介意修改系统文件。
自定义处理 灵活性极高,可以结合其他逻辑,只对特定规则生效。 需要一定的PHP代码能力,调试相对复杂。 有特殊需求的进阶用户,例如需要根据不同来源进行不同处理。

给新手的建议: 请直接使用 方法一,它完全能满足你的需求,而且最安全。

给网站管理员的建议: 如果你确定网站所有采集规则都需要这个功能,并且愿意承担维护修改的代价,方法二是最佳选择。

-- 展开阅读全文 --
头像
dede模板修改视频,如何快速上手?
« 上一篇 05-01
C语言settimer函数如何正确使用?
下一篇 » 05-01

相关文章

取消
微信二维码
支付宝二维码

目录[+]