2012-07-28 1 views
4

이 코드를 사용하면 먼저 전체 단어 파일을 배열로 처리 한 다음 파일에서 해당 단어에 대해 전달 된 문자열을 검사해야합니다. 일치하는 경우 *로 대체하십시오. PHP : 배열 to 파일 검사 및 바꾸기

wordalex 
wordjordan 
wordjohn 
.... 

불행히도 내가 전달 된 문장은 내가 예상하는 방식으로 필터링되지 않습니다

파일

은 같은 것입니다. 실제로 아무 일도 일어나지 않습니다. 주어진 코드를보고 도움을 주시겠습니까?

$comment = "the wordalex if this doesn't get caught!"; 
$filterWords = file('badwords.txt', FILE_IGNORE_NEW_LINES); 
//print_r($filterWords); 
$textToPrint = filterwords($comment,$filterWords); 
echo $textToPrint; 

function filterwords($text, $filterArray){ 
    $filterCount = sizeof($filterWords); 
    for($i=0; $i<$filterCount; $i++){ 
     $text = preg_replace('/\b'.$filterWords[$i].'\b/ie',"str_repeat('*',strlen('$0'))",$text); 
    } 
    return $text; 
} 

원본 문장에는 실제 단어가 있지만 게시 목적으로는 제거됩니다. 빈 줄을 무시하고

$filterWords 당신에게

답변

1

빌드 감사드립니다. preg_replace()

$replacements = array(); 
$patterns = array(); 

foreach ($filterWords as $word) { 
    // ignore empty words, just in case 
    if (empty($word)) continue;   

    $replacements[] = str_repeat('*', strlen($word)); 
    $patterns[] = "/\b$word\b/i"; 
} 

그리고 : 당신은 실제로 모두 FILE_IGNORE_NEW_LINESFILE_SKIP_EMPTY_LINES

$filterWords = file('badwords.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 

빌드 교체 배열을 필요

$textToPrint = preg_replace($patterns, $replacements, $comment); 

Hello wordJoHN NOTwordjohn에서 Hello ******** NOTwordjohn를 얻을 것입니다.

+1

감사합니다. 작동하지만 ... 일치하는 정규식을 수행하지 않습니다. 그래서 세계적인 클래스를 작성하면 cl ***이됩니다. 나는 그들이 그들 자신이 아닌 전체 단어의 일부일 때 그 단어들을 무시하기를 원한다. –

+0

단어 일치 만하기 위해'preg_replace()'로 편집했다. – uzyn

+0

다시 preg과 동일한 오류가 발생합니다. 어떤 방식 으로든 이것은 uzyn으로 분류 될 수 있습니까? 노력을 정말 감사드립니다

경고 : preg_replace() [function.preg-replace] : 컴파일 실패 : 오프셋 2에서 반복 할 수 없음 –

2

함수 정의에서 단어 목록 $filterArray을 호출합니다.

function filterwords($text, $filterArray){ 

그러나 함수에 걸쳐

, 당신은 그것을 $filterWords를 호출합니다.

정의에서 $filterWords으로 이름을 바꾸거나 각 발생의 이름을 $filterArray으로 바꿉니다.

+0

이름을 변경 한 후, [작품] (http://codepad.org/LGkFQzXE). – Wiseguy