【问题标题】:PHP - Loop through all links, remove content after last occurancePHP - 遍历所有链接,在最后一次出现后删除内容
【发布时间】:2014-11-12 07:44:51
【问题描述】:

我有一个变量,其中包含整篇文章,包括文本和一些链接。

我需要遍历变量中的内容并找到包含特定单词的所有链接实例。找到它们后,我需要删除每个找到的 URL 中最后一个 / 之后的所有内容。

例如: 假设该页面有 8 个链接 - 其中 4 个包含“文章”一词。 我需要找到每个包含“文章”一词的链接,然后在每个链接中最后一次出现 / 之后删除所有内容。

到目前为止,我已经尝试过使用一些正则表达式,例如:

    /<a.*?href\s*=\s*["\']([^"\'>]*article[^"\'>]*)["\'][^>]*>.*?<\/a>/si

但还没有找到一种方法来实际替换最后一个 / 之后的所有内容

关于如何实现这一点的任何想法?

【问题讨论】:

  • 文章是动态的,所以链接和内容永远不会相同。它们从数据库中检索并存储在单个变量中。已经包含 HTML 标记。
  • 这是 DOM 而不是正则表达式的工作。
  • 即使页面上还没有内容?这是从 MySQL 数据库中检索的内容,需要在页面上输出之前进行这些更改。

标签: php regex loops hyperlink


【解决方案1】:

使用 DOM 工具意味着您更关心您的 CPU。我并不是说正则表达式完全用于文本处理,它不是提供解决方案的合适工具,但是,针对特定工作的特定工具总是几乎更干净并且性能更好。

按照您已经说过的,我以这种方式修改了您的正则表达式:

(<a(?>.+?)href\s*=\s*(["'])(?>[^"'><]*?article)(?>[^>]*?/))(.*?)(\2.*?>[^<]++</a>)

并且您只需将完整匹配替换为第 1 和第 4 个捕获组。所以代码是:

echo preg_replace('~(<a(?>.+?)href\s*=\s*(["\'])(?>[^"\'><]*?article)(?>[^>]*?/))(.*?)(\2.*?>[^<]++</a>)~s', '\1\4', $html);

我也发了live demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2020-03-03
    相关资源
    最近更新 更多