2010-11-30 23 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