1

我有一些我正在调用str_replace()的基本 HTML,我需要在 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!

4

2 回答 2

1

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

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

此正则表达式还使用后视 ( the (?<=href=\")),因此它实际上不匹配href=".

警告:

  • 需要知道除了 HTTP 和 HTTPS 之外的 HTML 中还有哪些URL 方案(如果有)。
  • 像标签这样的一些link标签也有一个href属性。确保你没有更换这些。如果您只需要A使用 Regex 匹配标签,那么您的 regex 复杂性将大大增加,并且仍然不会真正安全。
  • Regex Eval 的效率和安全性要低得多,但如果您需要 URL 编码,您可以尝试在替换时对其进行 URL 编码,就像另一个答案的第二次返回一样。
  • 总的来说,Regex 不一定是最好的解决方案。使用 HTML 解析器可能会更好...
于 2010-11-30T01:31:49.680 回答
0

试试这个:

$str = preg_replace(
    "(href=\"([^\"]+)\")ie",
    "if(substr('$1',0,7) == 'http://')
        return stripslashes('$1');
     else
        return 'generate_book.php?link='.urlencode(stripslashes('$1'));",
    $str);
于 2010-11-30T01:21:33.367 回答