【问题标题】:Replace Local Links, Keep External Links替换本地链接,保留外部链接
【发布时间】:2009-04-09 12:44:29
【问题描述】:

我有一个 API 调用,它本质上返回托管 wiki 应用程序页面的 HTML。然后我会根据我的网站样式指南做一些 substr、str_replace 和 preg_replace 功夫来格式化它。

我做了一组调用来格式化我的左侧导航(将指向 pageX 的链接更改为我的 wikiParse?page=pageX 类型的东西)。我可以在左侧导航中安全地执行此操作。然而,在正文中,我不能安全地假设链接是指向内部页面的链接。它很可能是指向外部资源的链接。所以我需要做一个 preg_replace 匹配 href= 后面没有 http://。

这是我的尝试:

$result = preg_replace('href\=\"(?!http\:\/\/)','href="bla?id=',$result);

这似乎去除了页面上的全部内容。有人看到我在哪里滑倒了吗?我不认为我离得太远了,只是看不到下一步该去哪里。

干杯

【问题讨论】:

    标签: php regex parsing negative-lookahead


    【解决方案1】:

    preg_* functions 期待 Perl-Compatible Regular Expressions (PCRE)。与普通正则表达式的结构差异在于,表达式本身被包装在分隔符中,将表达式与可能的modifiers 分开。经典的分隔符是/,但 PHP 允许除反斜杠字符之外的任何其他非字母数字字符。另见Intruduction to PCRE in PHP

    所以试试这个:

    $result = preg_replace('/href="(?!http:\/\/)/', 'href="bla?id=', $result);
    

    这里href="(?!http://) 是正则表达式。但是由于我们使用/作为分隔符,所以/在正则表达式中的出现必须使用反斜杠进行转义。

    【讨论】:

    • 好眼光!我知道这很明显......谢谢。
    【解决方案2】:

    您的正则表达式缺少开始和结束分隔符(默认为“/”);

    $result = preg_replace('/href\=\"(?!http\:\/\/)/','href="bla?id=',$result);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2021-11-17
      • 2020-12-03
      • 2018-03-27
      • 1970-01-01
      • 2018-12-06
      相关资源
      最近更新 更多