2011-07-05 8 views
-1

에서 다음 함수는 배열에 일부 단어를 제거합니다 공백을 조정하고 내가 필요한 다른 작업을 수행. 나는 또한 단어로 쓰는 것처럼 대시를 제거해야합니다. 그러나이 함수는 대시를 제거하지 않습니다. 뭐가 문제 야?대시를 제거 할 수 없습니다 (-) 문자열

function stripwords($string) 
{ 
    // build pattern once 
    static $pattern = null; 
    if ($pattern === null) { 
    // pull words to remove from somewhere 
    $words = array('alpha', 'beta', '-'); 
    // escape special characters 
    foreach ($words as &$word) { 
     $word = preg_quote($word, '#'); 
    } 
    // combine to regex 
    $pattern = '#\b(' . join('|', $words) . ')\b\s*#iS'; 
    } 

    $print = preg_replace($pattern, '', $string); 
    list($firstpart)=explode('+', $print); 
    return $firstpart; 

} 
+0

'$ 패턴 '은 어떻게 생겼습니까? –

+0

대시가 아닌 하이픈입니다. 대시가 : - – Buddy

+0

예상대로 작동하지 않는 예제를 줄 수 있습니까? – Gumbo

답변

1

는, 문제는 단어 경계를 지정하는 \b입니다. 하이픈 앞뒤에 공백이 있으면 "-"처럼 제거하지 않으므로 단어 경계가 적용되지 않습니다. http://www.regular-expressions.info/wordboundaries.html에서

:

단어 경계 자격 세 가지 다른 위치 있습니다 : 첫 번째 문자가 단어 문자 인 경우 문자열의 첫 번째 문자 전에

  1. 가. 마지막 문자가 단어 문자 인 경우 문자열의 마지막 문자 후
  2. .
  3. 사이에 두 문자가 있습니다. 여기서 은 단어 문자이고 다른 문자는 은 단어 문자가 아닙니다.

A "단어 문자는"단어를 형성하는 데 사용할 수있는 문자입니다.

간단한 해결책 :

당신의 패턴 \b과 함께 \s를 추가하고 긍정적 숨김 모양과 긍정적 인 예견을 사용함으로써, 당신은 당신의 문제를 해결할 수 있어야한다.

$pattern = '#(?<=\b|\s|\A)(' . join('|', $words) . ')(?=\b|\s|\Z)\s*#iS'; 
+0

공백 및 복합 단어로 어떻게해야합니까? 즉 ... 난 내 정확한 패턴이 기능에 무엇 – smepie

+0

alphabeta에서 단일 단지 단어 ...하지 알파 때 "알파"(복합 단어, 예를 들어) 밖으로 제거되는 것을 필요하십니까? – smepie

+0

@smepie - 위의 정규식을 업데이트하여 긍정적 인 검색 기능과 긍정적 인 검색 기능을 사용하여 단어 경계 및 공간을 찾습니다. 마지막 문자이거나 대시로 시작하거나 끝나는 단어는 대시를 제거하지 않기 때문에 완벽하지는 않습니다. 당신의 패턴 "CANON DIGITAL"와 –

0

아무 데나 당신의 정규식 패턴에서 대시를 찾고 있습니다. 그냥하지 마시고

$string = str_replace('-', '', $string); 

정규식을 마친 후에는 어떻게해야합니까? 귀하의 질문에 대답하려면

+0

이미 시도 ... 어쩌면 프랑소와 맞습니다 – smepie

관련 문제