2011-09-21 68 views
0

我有一個非常簡單的問題,那就是......給我一個hedache ...修剪/擦除/移除鏈接與正則表達式

我只想修剪所有鏈接(www.link.com) (http://www.link.com)(http://link.com)... wathever,從給定的字符串與此正則表達式:

$regex = "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?"; 

只要打開他們的空白。

這是我認爲不會工作實際代碼...

<?php 

$string = 'ads dsa asd asd as da ds www.something.com adss dsad a sdas d'; 
$pattern = "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;/~\+#]*[\w\-\@?^=%&amp;/~\+#])?"; 

$replacement = ' nothing '; 
echo preg_replace($pattern, $replacement, $string); 

?> 

它一直在說我,

(!) Warning: preg_replace() [function.preg-replace]: Unknown modifier ':' in C:\wamp\www\ceva.php on line 9 
    Call Stack 
    # Time Memory Function Location 
    1 0.0005 363504 {main}() ..\ceva.php:0 
    2 0.0005 363952 preg_replace () ..\ceva.php:9 

任何幫助,將不勝感激:d

+0

@StackOverlowNewbie:這也不算太壞。 – alex

回答

0

看起來很不滿冒號。嘗試使用正則表達式中的反斜槓(因此將「:」轉換爲「\:」。

+0

你說我需要更好的鏈接正則表達式匹配嗎?我無法在regexlib上找到另一個... – Master345

+0

我不確定你是否需要一個*更好的*,PHP只是在這個問題上嚇壞了。 (不同的語言對待regexps的方式略有不同)。我只是先嚐試​​一下,看看它是否有效。 – Dave

+1

冒號是有效的,問題是正則表達式的分隔符,它假定它是'('和因此'後'),它認爲下一個是修飾符(例如'i'不區分大小寫),但即使修復這種模式似乎還存在其他問題。 – derp

2

正則表達式在php中的模式需要被分隔符包圍以顯示模式開始和停止的位置以及修飾符(不區分大小寫,多行...等)開始,最常見的是你會看到正斜槓作爲分隔符,但大多數任何字符都可以工作,例如:/pattern[a-z]*/i注意第一個字符是正斜槓(/)和模式本身以相同的字符結尾(/),之後只需要修飾符,如i,用於不區分大小寫的等等(請參閱:pattern modifiers)。無論第一個字符是什麼,分隔符和模式部分都必須以相同字符結尾作爲結尾分隔符。你所看到的錯誤意味着你的f第一個字符是一個開括號,是分隔符。在下一個左括號之後,之後的所有內容都應該是修飾符。錯誤是說結束分隔符後有一個無效的修飾符。爲了解決這個問題,你應該能夠在正則表達式周圍放置一個分隔符,它應該可以工作。見Delimetersphp regular expressions的一般參考。

編輯: 我想知道爲什麼你得到一個關於冒號作爲問題字符的錯誤。顯然PHP也支持支架風格分隔符,如{}。以左括號爲分隔符,右括號爲結尾分隔符。以下字符預計爲分隔符,並且當關閉分隔符後面的第一個字符(冒號由於它是無效修飾符而到達)時,該模式將引發錯誤。 TIL。

0

這是非常非常簡單,但可能是不夠的,它只是假定有

<?php 
    $string = 'here goes 1 http://google.com and 2 http://www.google.com and also 3 www.google.com?q=asd& and thats it'; 
    $pattern = '/((http|ftp|https):\/\/(www\.)?|www\.)[^\s]*/'; 
    $return = preg_replace($pattern, '<link>', $string); 
    var_dump($return); 
?> 
0

你忘了周圍的正則表達式的分隔符的鏈接後,一個空白:

代替:

$pattern = "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;/~\+#]*[\w\-\@?^=%&amp;/~\+#])?"; 

嘗試:

$pattern = "/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-.,@?^=%&amp;\/~\+#]*[\w\[email protected]?^=%&amp;\/~+#])?/"; 

$pattern = "{(ftp|https?)://[-\w]+(\.[-\w]+)+([-\w.,@?^=%&;/~+#]*[-\[email protected]?^=%&;/~+#])?}";