문제

다음과 같이 패턴 변수에 별명으로 사용하기에 불법인 작은 단어 목록이 포함된 패턴이 있습니다.

$pattern = webmaster|admin|webadmin|sysadmin

사용 preg_match, 이 단어가 포함된 닉네임은 금지되지만 "와 같은 것을 등록하려면 어떻게 해야 합니까?"admin2" 또는 "thesysadmin"허용되나요?

이것은 내가 지금까지 가지고 있는 표현이다:

preg_match('/^['.$pattern.']/i','admin');

// 허용되어서는 안 됩니다.

메모:사용하여 \b 별로 도움이 되지 않았습니다.

도움이 되었습니까?

해결책

정규식을 전혀 사용하지 않는 것은 어떻습니까?
그리고 함께 일하면서 explode 그리고 in_array ?

예를 들어 다음과 같습니다.

$pattern = 'webmaster|admin|webadmin|sysadmin';
$forbidden_words = explode('|', $pattern);

패턴을 배열로 분해합니다. 구분 기호로.


이 :

$word = 'admin';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

당신을 얻을 것이다

admin is not OK

반면에 이것은 (동일한 코드;단어만 바뀐다) :

$word = 'admin2';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

당신을 얻을 것이다

admin2 is OK

이렇게 하면 전체 단어와 일치하는 올바른 정규식을 찾는 것에 대해 걱정할 필요가 없습니다.그것은 단지 정확한 단어와 일치할 것입니다 ;-)


편집하다 : 한 가지 문제는 비교가 대소문자를 구분한다는 것입니다. :-(
모든 것을 소문자로 작업하면 도움이 됩니다.

$pattern = strtolower('webmaster|admin|webadmin|sysadmin');  // just to be sure ;-)
$forbidden_words = explode('|', $pattern);

$word = 'aDMin';
if (in_array(strtolower($word), $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

당신을 얻을 것이다 :

aDMin is not OK

(나는 '를 보았다.i' 내 답변을 게시한 후에만 정규식에 플래그를 지정하세요.그래서 수정했어야지)


편집 2 : 그리고 정규식을 사용하여 정말로 이를 수행하려면 다음 사항을 알아야 합니다.

  • ^ 문자열의 시작을 표시
  • 그리고 $ 문자열의 끝을 표시

따라서 다음과 같이 해야 합니다.

$pattern = 'webmaster|admin|webadmin|sysadmin';

$word = 'admin';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

$word = 'admin2';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

괄호는 아마도 필요하지 않을 것입니다. 그러나 나는 내가 원하는 것을 분리하기 위해 괄호를 사용하는 것을 좋아합니다.

그리고 동일한 종류의 출력을 얻게 됩니다.

admin is not OK

admin2 is OK

아마도 사용하고 싶지 않을 것입니다. [ 그리고 ] :이는 "우리 사이에 있는 전체 문자열"이 아니라 "우리 사이에 있는 모든 문자"를 의미합니다.

그리고 참고로 :매뉴얼 preg 구문 ;-)

다른 팁

따라서 금지 된 단어는 될 수 있습니다 부분 그들의 사용자 이름이지만 모든 것이 아닌가?

.NET에서 패턴은 다음과 같습니다.

 Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$")

"^"은 문자열의 시작과 일치하고 "$"는 끝과 일치하므로 그 단어 중 하나에서 정확한 일치를 찾고 있습니다. 나는 해당 PHP 구문에 약간 퍼지됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top