2013-10-17 1 views
1

안녕하세요 동료 프로그래머를 정규식을, 긴 시간 럴커 여기 그래서 Node.js를에이 IRC 봇을 작성했다만들려고 URL 매칭 빠른 IRC를 봇에 대한

을 XD, 및 주요 기능 중 하나는 자동으로 시간 제한에있다 사용 권한없이 링크를 게시하는 사용자

많은 테스트와 연구 끝에 사용자가 허락없이 링크를 게시하려는 시도를하는 것을 고려하면 거의 모든 URL과 일치하는 정규 표현식을 생각해 냈습니다.

/((?!\w+\.+\s\w+\b)\w+\W*(\.|dot|d0t)\W*(aero|asia|biz|cat|com|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)\b)/i 

그것은 사용자가 같은 것을 입력 할 때 일치하는 항목을 무시하면서, "점"로 점을 교체하거나 점 사이에 특수 문자를 추가 점 사이에 공백을 추가 고려 사항 사용자에 소요 "단어를. 그것은 좋았다"이 때문에 (유효한 URL 확장).

이 정규 표현식은 URL 보호를 우회하려는 사용자의 거의 모든 사건을 처리하며 거의 오 탐지 (false positive)는 거의 찾아 내지 못하지만, 조금 걱정할 수도 있습니다.

누구든지 더 빠르게 실행되는 동일한 기능을 가진 더 나은 정규식을 알고 있습니까? 아니면 더 빠르게 실행할 수있는 개선 방법을 알고 있습니까?

정규식 설명 :

전체 정규식 :

/((?!\w+\.+\s\w+\b)\w+\W*(\.|dot|d0t)\W*(aero|asia|biz|cat|com|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)\b)/i 

그룹 : (?!\w+\.+\s\w+) - 부정적 예측 - 점 또는 다중 점 (. +) 다음에 사용자가 (+ w \) 단어를 입력하면 확인 스페이스 (\ s)이면, 다음 문자가 단어 (\ w +)인지 확인하십시오. 이 정규식 그룹이 일치하면 대개 사용자는 "is"와 같은 가능한 url 확장자로 시작하는 두 번째 문장이 시작 되더라도 전체 중단 또는 줄임표가있는 문장을 끝내고 다른 문장을 끝내므로 정규식이 일치하지 않아야합니다. 또는 "그래서", 그리고 부정적인 lookahead는 url 매칭을 멈춰야한다.

\w+ - 단어 - google.com과 같은 URL을 고려한 URL의 첫 번째 부분입니다 (URL 프로토콜 (있는 경우) 및 URL의 첫 번째 부분 (일반적으로 www)을 무시합니다. 그냥 URL을 감지하고 실제로 다른 목적으로 추출하지 않음).

\W*(\.|dot|d0t)\W* - 숫자가 아닌 임의의 수의 문자 다음에 점 (또는 점을 피할 수있는 방법)이 뒤 따르며 영숫자가 아닌 문자가 여러 개인 - 사용자가 Google (점)과 같은 URL을 입력하여 필터를 우회하는 것을 방지합니다. co.kr 사이트뿐만 아니라 구글과 같은 단어와 단어 사이의 간격. com.

(aero|asia|biz|cat|com|coop|info|int|jobs|mobi|museum|name|net|org|post|pro|tel|travel|xxx|edu|gov|mil|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)가 - 가능한 모든 URL의 도메인 확장자 일치 - 여기 말을 많이하지,이 같은 이상한 구두점 할 사용자의 잘못된 반응을 방지

\b "문구를 다음 구."- 경계 (boundary) 경기 (경계 문자 또는를 문자열 끝)

편집 : Ive가 더 개선 된 점이나 더 좋은 방법을 알고있는 사람이 (ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au...)에서 (a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnorsuvxyz]|d[dejkmoz]|e[ceghrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnorstuvxyz]|t[cdfghjklmnoprtvwz]|u[agksyz]|v[aceginu]|w[fs]|y[etu]|z[amw])으로 분명한 개선을 보였습니까?

미리 감사드립니다. 가브리엘.

+0

사회 문제에 대한 기술적 해결책은 항상 실패합니다. –

+0

스팸 봇으로부터 URL을 검색하려면 (URL 검색을 우회하려고 시도하는 경우에도) 여전히 "사회적인 문제"로 분류됩니까? – MoltenTheory

답변

0

은 아마 더 빨리 :

domainExtTable = { aero: true, asia: true, biz: true, ... }; // init just once 
results = text.match(/((?!\w+\.+\s\w+\b)\w+\W*(\.|dot|d0t)\W*(\w{2,4})\b)/i); 
domainExt = results[4]; 
if (domainExt in domainExtTable) { ... } // this is a match 

말하기 어렵다은 정규 표현식 컴파일러가 얼마나 좋은에 따라 달라집니다.

미리보기를 제거하면이 속도가 훨씬 빨라질 수 있습니다. 확실하게 "google. co.kr"과 일치하지 않겠습니까?