【问题标题】:What's a PHP regex to target certain URLs?什么是针对特定 URL 的 PHP 正则表达式?
【发布时间】:2010-11-30 01:17:17
【问题描述】:

我有一些基本的 HTML,我在上面调用 str_replace(),我需要在 HTML 字符串中找到的所有 URL 附加一个“generate_book.php?link=”,但我需要排除任何外部链接,例如;

<a href="gst/3.html">Link</a> -- 这应该变成 -- <a href="generate_book.php?link=gst/3.html"></a>

<a href="http://example.com">Link</a> -- 这个应该不用管

感谢您的大脑 powa!

【问题讨论】:

    标签: php html regex str-replace


    【解决方案1】:

    您需要在开始时使用前瞻来确保它与 HTTP 或 HTTPS 不匹配。不放心也可以加mailto

    $str = preg_replace("/(?<=href=\")(?!http:\/\/|https:\/\/)([^\"]+)/i", "generate_book.php?link=$1", $str);
    

    这个正则表达式还使用了后视((?&lt;=href=\")),因此它实际上不匹配href="

    警告:

    • 需要知道除了 HTTP 和 HTTPS 之外的 HTML 中还有哪些URL schemes(如果有的话)。
    • 一些标签,如link 标签也有一个href 属性。确保你没有更换这些。如果您只需要使用正则表达式匹配A 标签,那么您的正则表达式复杂性将大大增加,并且仍然是won't really be safe.
    • Regex Eval 效率较低且不安全,但如果您需要 URL 编码,您可以尝试在替换时对其进行 URL 编码,就像另一个答案的第二次返回一样。
    • 总体而言,Regex 不一定是解决此问题的最佳解决方案。使用 HTML 解析器可能会更好...

    【讨论】:

    • 好的,我已经尝试了此页面上的所有建议,但它们都产生了错误。你的似乎产生的最少:警告:preg_replace() [function.preg-replace]: Unknown modifier '/' in C:\wamp\www\projects\kineo\taxteam[CD_COURSE] GCSB (Central)\htdocs\book \generate_book.php 第 64 行
    • 糟糕,将 http/https 后面的 // 都替换为 \/\/ 我没有使用 PHP 来测试正则表达式,所以我不必逃避它们。
    • 这对我来说非常好用,谢谢,我不想用我正在使用它的上下文吓跑任何人,但它是用于刻录到 CDROM 的 Server2Go 包,所以很少涉及危险,只是链接断开:)
    【解决方案2】:

    试试这个:

    $str = preg_replace(
        "(href=\"([^\"]+)\")ie",
        "if(substr('$1',0,7) == 'http://')
            return stripslashes('$1');
         else
            return 'generate_book.php?link='.urlencode(stripslashes('$1'));",
        $str);
    

    【讨论】:

    • 我很确定您不能只将函数作为字符串传递。你想要的是preg_replace_callback()create_function()(或者如果使用> 5.3,则使用匿名函数)。
    • e 修饰符使 replace 参数被评估为 PHP 代码 PHP.net PCRE modifiers
    • 很抱歉成为 n00b,@alex 您能否提供一个示例代码来说明您的意思?我想我跟着,但我也是一个完全的新手:)
    • @Kolink 哦错过了。我一直避免使用它,因为在我看来它总是一个安全问题。
    • 如果您将正则表达式从 [^\"] 更改为检查有效的 URL 字符,则不会存在安全风险,因为这些字符是无害的 - 无论如何它都会在字符串中转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    相关资源
    最近更新 更多