REGEX- 혼합 숯이있는 성냥 (유일한) 단어
문제
안티 스팸/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);