什么是针对特定网址的PHP正则表达式?

时间:2010-11-30 01:17:18

标签: php html regex str-replace

我有一些我打电话给str_replace()的基本HTML,我需要在HTML字符串中添加“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> - 这应该保持不变

你的大脑很受欢迎!

2 个答案:

答案 0 :(得分:1)

您希望在开头使用预测,以确保它与HTTP或HTTPS不匹配。如果您担心,也可以添加mailto

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

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

警告:

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

答案 1 :(得分: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);