2011-04-13 3 views

답변

3

이 같은 소리를 알맞은 사용의 parse_url() :

<?php 
    $blacklist = array("asdf.com", "fun.com", "url.com"); 
    $input = "http://asdf.com/asdf/1234/"; 

    $url = parse_url($input); 

    echo (in_array($url['host'], $blacklist) ? '(FAIL)' : '(PASS)') . $url ['host']; 
?> 

출력 :

(FAIL)asdf.com 
1

한 가지 방법 : 입력이 블랙리스트에서 임의의 문자열을 포함하지 않는

$san = preg_replace($blacklist, '', $input); 

if($san !== $input) { 
    //contained something from the blacklist 
} 

경우, 문자열이 변경되지 반환됩니다.

는 다른, 어쩌면 더 적합 확실히 더 효율적인 접근 방법은 extract the host part from the input로하고 연관 배열로 블랙리스트 만들 수 있습니다

$blacklist = array(
     "asdf.com" => true, 
     "fun.com" => true, 
     "url.com" => true 
); 

그런 다음 테스트가 될 것 O(1)과 :

if($blacklist[$host]) { 
    //contained something from the blacklist 
} 
+0

을 당신은 내가 코멘트없이 표를 얼마나 싫어하는지 모르나요? 내 진노를 두려워하라! –

+0

@KingCrunch : 예. 첫 번째 것은 다소 해킹입니다. 두 번째 부분에 대해서 : PHP의 배열은 정렬 된 맵이며, 목록도 집합도 아닙니다. 'in_array'는 선형 검색을 수행해야하기 때문에 항상 느려집니다. 이것은 작은 배열에도 적용되지 않습니다 ... –

+0

배열은 맵으로뿐만 아니라 해시 맵으로 구현됩니다. 그러나, 그들은 상황에 따라 다르게 취급 될 수 있습니다. 예를 들어 배열을 집합, 목록, 스택, 대기열 등으로 사용할 수 있습니다. 그것의 단지 여기에 이름을 짓고 구현과 많은 관련이 없습니다. 그리고'in_array()'에 대해 : Clean code> 마이크로 최적화 – KingCrunch

1

foreach 문을 사용하면 아마 당신이 달성하려고하는지에 가장 적합한 솔루션입니다.

$blacklist = array("/asdf\.com/", "/fun\.com/", "/url\.com/"); 

foreach($blacklist as $bl) { 
    if (preg_match($bl, $input)){return true;} 
} 
+0

당신은 무엇에'돌려 보내고 있는가? – drudge

+0

@jnpcl 그가 기능 검사를 사용하는 경우. 물론 선택 사항입니다. 꽤 분명해 ... –

+0

답변을 제공하는 사람들에게는 명백 할 수도 있지만 OP에게는 분명하지 않을 수 있습니다. 귀하의 답변은 "있는 그대로"작동하지 않으며 실행 가능한 솔루션 임에도 불구하고 OP에 추가해야 할 추가 코드가 필요합니다. – drudge

0

in_array는 정확한 문자열을 검색 할 때 유용하지 않습니다.

당신은 배열을 통해 루프를 가지고 있고, 그것이

foreach($str in $blacklist) 
{ 
    if(stristr($input, $str)) 
    { 
     //found 
    } 
} 
+1

히트를 얻으면 불필요한 테스트를 피하기 위해'break'를 사용해야합니다 ... –

0

이 코드는 작동합니다 검색 :

$blacklist = array("asdf.com", "fun.com", "url.com"); 
$input = "http://asdf.com/asdf/1234/"; 
if (in_array(parse_url($input,PHP_URL_HOST),$blacklist)) 
    { 
    // The website is in the blacklist. 
    } 
+0

어떤 것이 @ jnpcl의 대답과 근본적으로 같습니다. 답변을 복제 할 필요가 없습니다 ... -1. –