문제

안티 스팸/Badwors 필터를 작성하고 있는데 가능하다면 필요합니다.

일치하는 (감지) : Fr1 & nd $와 친구가 아닌 혼합 문자로 형성된 단어 만

이것이 Regex로 가능합니까!?

친애하는!

도움이 되었습니까?

해결책

물론 Regex와 함께 가능합니다! 당신은 중첩 괄호와 일치하도록 요구하지 않습니다! :피

그러나 그렇습니다. 이것은 정규 표현이 제작 된 것입니다. An example:

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

이것은 다음과 같은 모든 것과 일치합니다.

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

그것은 할 것입니다 ~ 아니다 이것과 일치 :

ass

내가 믿는 것은 당신이 원하는 것입니다. 작동 방식 :

\S* 0 이상의 비 공간 문자와 일치합니다. [^\w\s]+ 기호 만 일치하고 (단어 나 공간이 아닌 것과 일치 함) 1 개 이상과 일치합니다 (따라서 기호 문자가 필요합니다.) \S* 다시 0 개 이상의 비 공간 문자 (기호 및 문자)와 일치합니다.

더 나은 전략을 제안 할 수 있다면 Perl에서는 REGEX를 변수에 저장할 수 있습니다. PHP 에서이 작업을 수행 할 수 있는지 모르겠지만 가능하다면 다음과 같은 변수 목록을 구성 할 수 있습니다.

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

또는:

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

따라서 모든 순열에서 "친구"와 일치 할 수 있습니다.

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

또는:

/$regex['f']$regex['r']$regex['i']$regex['e']$regex['n']$regex['d']/

물론, 두 번째는 불필요하게 동점으로 보이지만 그것은 당신을위한 PHP입니다. 두 번째는 아마도 최상의 솔루션이라고 생각합니다. 왜냐하면 그것은 모든 것이 별도의 변수보다는 해시에 모두 저장하기 때문일 것입니다.

다른 팁

가능하면, 당신은 매우 예쁜 REGEX 규칙을 가지고 있지 않지만, 기본적으로 Regex를 사용하여 설명 할 수있는 모든 패턴과 일치 할 수 있습니다. 까다로운 부분은 그것을 묘사하고 있습니다.

나는 당신이 그렇게 나쁜 단어를 감지하기 위해 많은 정규식 규칙을 가질 것이라고 생각합니다.

FR1 & nd $, 친구, fr ** nd*를 감지하려면 다음과 같은 regex를 사용할 수 있습니다.

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

각 규칙에 대해 이와 같은 작업을 수행하면 가능한 모든 문자의 변형이 괄호 안에 있습니다. 자세한 내용은 Regex 가이드를 선택하십시오.

(나는 당신이 원하는 badwords 필터를 가정하고 있습니다. friend 만큼 잘 frie**, 당신은 나쁜 단어와 가능한 모든 순열을 가릴 수 있습니다)

이것을 철저히 테스트하지는 않았지만 그렇게해야합니다.

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

다음과 같은 정규식을 구축 할 수 있습니다.

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

이것은 하나 이상의 문자 순서와 일치합니다 (\p{L}+, 보다 유니 코드 문자 선호도), 하나 이상의 숫자 또는 기호 ([\d\p{S}]+) 및 다음과 같은 비 whitescace 문자 \S*.

$str = 'fr1&nd$ and not friends';
preg_match('/\p{L}+[\d\p{S}]+\S*/', $str, $match);
var_dump($match);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top