2011-10-15 25 views
0

我在我的網站上有一項新功能,用戶可以通過textarea提交任何文本(我停止了所有HTML條目)。我仍然有一個主要問題,那就是他們可以輸入「http://somewhere.com」,這是我想要阻止的事情。我也想黑名單特定的單詞。這是我以前有:檢測textarea提交中的特定字詞

if (strpos($entry, "http://" or ".com" or ".net" or "www." or ".org" or ".co.uk" or "https://") !== true) { 
      die ('Entries cannot contain links!'); 

但是,這並沒有奏效,因爲它停止用戶提交任何文本。所以我的問題很簡單,我該怎麼做?

+0

如果我輸入'請去到www(點)的例子(點)com'?無論如何,你不能在strpos函數中使用'或'列表。 – animuson

+0

感謝您指出這兩件事。我想我會列入黑名單「www」,「(點)」,「[點]」,<"dot">,以及所有的變化,沒有列入黑名單本身。 – AviateX14

+0

你在那裏有效地做了什麼,說'if(strpos($ entry,'1')!== true)'。這將*總是*評估爲'TRUE',因爲'strpos()'*永遠不會返回'TRUE',這與您不能以這種方式使用'或'不同的事實除外。 – DaveRandom

回答

2

這是Regular Expressions的工作。

你需要做這樣的事情是什麼:

// A list of words you don't allow 
$disallowedWords = array(
    'these', 
    'words', 
    'are', 
    'not', 
    'allowed' 
); 
// Search for disallowed words. 
// The Regex used here should e.g. match 'are', but not match 'care' or 'stare' 
foreach ($disallowedWords as $word) { 
    if (preg_match("/\s+$word\s+/i", $entry)) { 
    die("The word '$word' is not allowed..."); 
    } 
} 

// This variable should contain a regex that will match URLs 
// there are thousands out there, take your pick. I have just 
// used an arbitrary one I found with Google 
$urlRegex = '(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-zA-Z0-9\.&amp;%\$\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\-]+\.)*[a-zA-Z0-9\-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\?\'\\\+&amp;%\$#\=~_\-]+))*'; 

// Search for URLs 
if (preg_match($urlRegex, $entry)) { 
    die("URLs are not allowed..."); 
} 
+0

完美的工作,但是,如果我輸入例如http://而不是http,那麼它仍然允許我發佈任何方法? – AviateX14

+0

對不起,不太明白你說的那裏,你的意思是鏈接匹配部分不能正常工作?坦率地說,正則表達式並不是我最好的主題(這就是爲什麼我從[Google](http://www.google.co.uk/search?q=regex+match+url)的第一個結果中得出結論的原因。 )。如果你想要某人給你一個適合你的目的的正則表達式,更新這個問題(或者可能是一個新的問題,因爲它可能證明是正當的)。你要找的是「正則表達式來匹配一個字符串中的URL」。請記得先搜索它! – DaveRandom

0

您必須多使用一次strpos。用你的方式你評估或聲明返回true/false並將其傳遞給strpos。

這樣,它應該工作:

if (strpos($entry, "http://") !== false || strpos($entry, "https://") !== false || strpos($entry, ".com") !== false) 
0

一個簡單的方法做,這是把不準到一個數組和循環的所有單詞,通過他們檢查每一個。

$banned = array('http://', '.com', '.net', 'www.', '.org'); // Add more 
foreach ($banned as $word): 
    if (strpos($entry, $word) !== false) die('Contains banned word'); 
endforeach; 

這裏的問題是,如果你太忘乎所以,開始禁止單詞「COM」什麼的,還有其他的單詞和短語,這可能是完全合法的,它包含字母「COM」以這種方式那會導致誤報。您可以使用正則表達式來搜索看起來像URL的字符串,但是您可以像上面那樣輕鬆地分解它們。沒有有效的方法來完全阻止人們發表評論中的鏈接。如果你不想讓他們在那裏,你最終只需要使用審覈。社區審覈工作得很好,例如看看Stack Overflow