2009-05-10 6 views

답변

6

은 정규식으로 가능 (난 당신이 friend뿐만 아니라 frie**를 원하는 것 BADWORDS 필터 있으리라 믿고있어, 모든 가능한 순열뿐만 아니라 나쁜 단어를 마스크 할 수 있습니다)! 중첩 된 괄호와 일치하는 것을 요구하지 않습니다! : P

하지만 그렇습니다. 정규식이 구축 된 것입니다. 예 :

/\S*[^\w\s]+\S*/ 

이 다음의 모든 일치합니다 :

@ss 
as$ 
a$s 
@$s 
a$$ 
@s$ 
@$$ 

그것은 것이다 하지 일치하는이 :

나는 당신이 원하는 것을 믿고
ass 

. 작동 방식 :

은 0 개 이상의 공백이 아닌 문자와 일치합니다. [^\w\s]+은 기호 (단어 또는 공백이 아닌 모든 문자와 일치 함)와 일치하며 그 중 하나 이상과 일치합니다 (따라서 기호 문자가 필요합니다). \S*은 0 개 이상의 공백이 아닌 문자와 다시 일치합니다 기호 및 문자).

더 나은 전략을 제안 할 수 있다면 Perl에서 변수에 정규 표현식을 저장할 수 있습니다.당신이 PHP에서이 작업을 수행 할 수 있을지 모르겠지만, 당신이 할 수있는 경우에, 당신은 같은 변수의 목록 구성 할 수 있습니다 :

$a = /[[email protected]]/ # regex that matches all a-like symbols 
$b = /[bB]/ 
$c = /[cC(]/ 
# etc... 

또는 : 그래서

$regex = array('a' => /[[email protected]]/, 'b' => /[bB]/, 'c' => /[cC(]/, ...); 

그런 식으로, 당신이 할 수있는을

/$f$r$i$e$n$d/ 

또는 :

/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/ 
을 가진 모든 순열의 일치 "친구"

허가 됨, 두 번째 것은 불필요하게 길어 보이지만, PHP는 당신을위한 것입니다. 두 번째 것은 아마 최선의 해결책이라고 생각합니다. 해시에 모든 것을 별도의 변수로 저장하는 것이 아니기 때문에 아마 최선의 해결책이라고 생각합니다.하지만 내가 만드는 정규 표현식이 좀 못생긴다는 ​​것을 인정합니다.

+0

굉장한 정규식 + 설명 +1! Btw, PHP의 Regex는 문자열에 저장되므로, 여러분이 제안하는 것과 같은 변수 치환이 가능하다는 것은 확실합니다. –

+0

사실, 그것을 함수에 작성하는 것이 흥미로울 수 있습니다. 일반 단어를 전달하면 해당 단어를 감지하는 올바른 정규식으로 응답합니다. 내가 볼 수있는 유일한 문제는 W = \/\/또는 여러 가지 문자와 같은 것입니다. –

+0

W =! (? : [wW] | \\/\\ /)! (필자의 Perl에서). 다중 문자 일치가있는 W와 같은 경우에는 더 어려울 수 있지만 확실히 가능합니다. 문자를 통해 문자열을 통과하고 해당 문자와 ​​일치하는 정규식을 검색 한 후 함수를 하나의 거대한 (끔찍한 모양의) 정규식으로 모으는 함수를 쉽게 작성할 수 있습니다. 워드. 그러나 필자는 PHP를 자주 사용하지는 않습니다. 변덕 스러울 때 Perl에서 할 수 있습니다. 아니면 그 표정이 무엇이든간에. –

0

다음

\p{L}+[\d\p{S}]+\S* 

이 (Unicode character preferences를 참조 \p{L}+) 하나 개 이상의 숫자 또는 기호 ([\d\p{S}]+) 및 다음 하나 이상의 문자의 순서와 일치합니다 비 공백 문자 \S*.

$str = 'fr1&nd$ and not friends'; 
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match); 
var_dump($match); 
0

매우 정규식 규칙은 없지만 기본적으로 정규식을 사용하여 설명 할 수있는 모든 패턴과 일치 할 수 있습니다. 까다로운 부분은 그것을 설명하고 있습니다.

난 당신과 같이 나쁜 단어를 감지하는 정규식 규칙의 무리했을 것이라고 추측 것 :

: FR ** 차 * 당신은 같은 정규 표현식을 사용할 수

이 FR1에게 & 차의 $ 친구를 검색하려면를

/fr[1iI*][&eE]nd[s$Sz]/

각 규칙에 대해 이와 같이 처리하면 대괄호 안에 가능한 모든 문자가 표시됩니다. 자세한 정보는 정규식 가이드를 참조하십시오.

물론

+0

. regexes는 꽤 끔찍한 것처럼 보이는데, 특히 맞춤법 오류를 설명하려고 할 때 그렇습니다. –

0

철저하게 이것을 테스트하지 못했지만,이 그것을 수행해야합니다 나는 지루했고 펄에 한 번 이런 짓을

(\w+)*(?<=[^A-Za-z ]) 
+0

"a"(공백 뒤에 오는 단어)와 일치합니다. –

+0

나의 나쁜 :) 나는 그것을 바꿨다, 여분의 공간은 그것을해야한다. –

+0

나는 탭으로도 갈 것이지만 이것은 효과가있다. –