2012-06-15 4 views
1

가능한 중복은 :
Regular expression: match all words exceptregex를 사용하여 일부 단어를 제외한 모든 것을 삭제하는 방법은 무엇입니까?

나는 선택을 부정하는 PHP에서 정규식을 사용하는 당신의 도움이 필요합니다. 그래서 다음과 같은 문자열이 있습니다 : "Hello my name is tom"

내가해야 할 일은 "tom"이나 "jack"또는 "alex"가 아닌이 문자열 마녀의 모든 것을 삭제하는 것입니다.

$MyString = "Hello my name is tom" 
print_r(preg_replace('#^tom|^jack|^alex#i', '', $MyString)); 

그러나 그것은 작동하지 않습니다는 ...

당신은 나를 도와 드릴까요? 감사

+0

당신이 실제로 원하는 것들의 경기에서 새로운 캐릭터를 구축하는 것이 더 쉬울 수 있습니다. – Bergi

답변

4

당신이 뭔가을 제외한 모든 것을 삭제하려면이 될 수있다? 예를 들어 ... 당신이해야 할 노력했습니다 무엇

$testString = 'Hello my name is tom or jack'; 
$matches = array(); 
preg_match_all('/\b(tom|jack|alex)\b/i', $testString, $matches); 
$result = implode('', $matches[0]); 
echo $result; // tomjack 

는 ([^s]는 모든 문자 만의 일치합니다) 문자 클래스 구문을 사용합니다. 그러나 이것은 일련의 캐릭터들과 작동하지 않습니다. '워드 클래스'같은 것은 없습니다.)

+0

답장을 보내 주셔서 감사합니다.하지만 왜 $ result = implode ('', $ matches [0]); 결국? $ matches [0]은 (는) 배열이 아닙니다. '#. * (tom | jack | alex). * # i'를 사용하는 다른 대답을 보았지만 대신 preg_match를 사용하는 것이 더 좋다고 생각하십니까? 나는 실제로 – Mushr00m

+0

$ [0]이 실제로 배열이라는 사실을 이해하지 못한다. 그러므로 implode '호출. 다른 대답은 행복하게 원래 문자열에있는 모든 toms/jacks/alexes 중복을 제거하므로 내 솔루션이 약간 우월하다고 생각합니다.) – raina77ow

+0

이것이 대체가 아니라 새로운 배열에 필요한 이름을 뽑아 낸 다음 새로운 배열을 이름이있는 문자열로 함축시키는 것을 이해하기 위해 잠시 나마 걸렸습니다. 영리한. – Joeri

0

정규식 다음 뭔가 만 캡처 : 더 나은 다른 방법으로 주위를 끝낼

\b(?!tom|jack|alex)[^\s]+\b 
+0

그가 그렇게했다면, 그는 톰/잭/알렉스를 아무것도 교체하지 않았을 것입니다. 그는 정반대의 행동을 원한다. – h2ooooooo

+0

@ h2ooooooo : 감사합니다. 수정 됨. –

0

당신이 하지 "톰"또는 "잭"또는 모든 것을 제거하려면 "알렉스는"당신이 사용할 수있는 다음 :

$MyString = "Hello my name is jack"; 
print_r(preg_replace('#.*(tom|jack|alex)#i', '$1', $MyString)); 

이것은 단지 일치하는 이름을 가진 모든 문자열을 대체 .

+0

나는이 정규 표현식 '#. * (tom | jack | alex). * # i'를 사용하여 더 나은 결과를 얻었습니다. *. i가 없으면. * 문자가 없기 때문에 결국 문자열의 끝 부분이 깨집니다. – Mushr00m

+1

그리고 '내 이름은 톰이야, 나는 잭이 아니야.'라는 문구가 어떻게 생길까요?) – raina77ow

+0

* 문제가 보이지 않습니다. * 문자가 0 번 이상 사용할 수 없다는 것을 의미하지만, 여전히 나를 도왔습니다 ;-) – Mushr00m

0

당신은 당신이 원하는 것을 일치하고 문자열을 재구성 수 :

$s = 'hello my name is tom, jack and alex'; 

if (preg_match_all('/(?:tom|jack|alex)/', $s, $matches)) { 
print_r($matches); 
     $s = join('', $matches[0]); 
} else { 
     $s = ''; 
} 

echo $s; 

출력 :

tomjackalex 
관련 문제