2010-11-30 57 views
1

我有一些基本的HTML,我打电话str_replace(),我需要追加HTML字符串中找到的所有网址'generate_book.php?link=',但我需要排除任何外部链接,例如;什么是PHP正则表达式来定位某些URL?

<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表示赞赏!

回答

1

你需要使用一个先行之初,以确保它不符合HTTP或HTTPS。如果您担心,您也可以添加mailto

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

此正则表达式还采用了向后看(在(?<=href=\")),因此它实际上并不匹配href="

警告:

  • 需要知道其中URL schemes将是除了HTTP和HTTPS的HTML,如果有的话。
  • 一些标签,如link标签也具有href属性。确保你没有取代这些。如果您需要使用正则表达式匹配A标签,则您的正则表达式复杂度将会大幅增长,并且仍然是won't really be safe.
  • 正则表达式Eval的效率和不安全性要低得多,但如果您需要URL编码,则可以在替换时尝试对其进行URL编码就像其他答案的第二个回报一样。
  • 总的来说,正则表达式不一定是最好的解决方案。你可能会更好的HTML解析器...
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); 
+0

我敢肯定,你不能只是一个函数作为一个字符串在那里。你想要的是`preg_replace_callback()`和`create_function()`(如果使用> 5.3则使用匿名函数)。 – alex 2010-11-30 01:48:03

+0

`e`修饰符使`replace`参数被评估为PHP代码[PHP.net PCRE修饰符](http://uk3.php.net/manual/en/reference.pcre.pattern.modifiers.php) – 2010-11-30 01:52:11