2012-11-08 4 views
1

preg_match으로 계정 생성 스크립트의 이름 입력이 유효하다는 이유는 필드가 라틴어 또는 키릴 문자 만 가질 수 있기 때문입니다 (즉, 둘 다 가질 수는 없습니다). 이름이 무엇이든간에 필드에 포함되어 있으면 preg_match 조건이 충족되지 않습니다. 지금까지 나는 코드의 가능한 세 가지 변형을 시도했습니다 :preg_match never passes

if (!(preg_match('/^[a-z]$/i',$_POST['name']) || preg_match('/^[а-я]$/i',$_POST['name']))) back('The message'); 

if (!preg_match('/^[a-z]$/i',$_POST['name']) && !preg_match('/^[а-я]$/i',$_POST['name'])) back('The message'); 

하나와 preg 일치를 모두 채우려 고 시도하는 코드.

누구든지이 문제를 해결할 수 있도록 도와 주시겠습니까?

/^[a-z]$/i 

변경 그것에 :

/^[a-z]+$/i 

/^[а-я]+$/i 
+0

는 레그에서 UTF 모드를 활성화 시도해야 하는가? '.../iu' –

+0

@MarcB는 답장을 보내 주셔서 감사합니다. 그러나 작동하지 않았습니다. –

답변

4

문제는 당신이 정확히 하나 개의 문자로 이름을 제한하고 있다는 점이다 읽기 위해 is_latinis_cyrillic 이름 능력. 반전,

if is_latin xor is_cyrillic  -> OK 
else       -> not OK 

을 또는 : : 그런 다음 논리를 찾고 하나가 다른 falsetrue입니다 만 true의 경우

if !(is_latin xor is_cyrillic) -> not OK 

xor입니다.

또한 regexen은 하나의 문자와 일치합니다. 전체 단어와 일치하도록 /^[a-z]+$/i을 원할 것입니다. 또한 비 라틴어 단어/정규 표현식과 일치 시키려면 /^[а-я]+$/iu과 같은 u 수정자를 사용해야하며 소스 코드와 제목이 UTF-8로 인코딩되어 있는지 확인해야합니다. 그래서 :

if (!preg_match('/^([a-z]+|[а-я]+)$/iu', $_POST['name'])) { 
    // error 
} 
+2

정규 표현식을 배우는 데 꽤 많은 시간을 소비했기 때문에 실제로는 눈치 채지 못했습니다. 피곤해 져야합니다. 고마워요! –

1

하자 추상적 그 preg_match 기능에

1

또한 주장 할 수 모두 하나의 정규식 :

if (!preg_match('/ ^[a-z]+$ | ^[\p{Cyrillic}]+$ /ixu',$_POST['name'])) { 

주 두 | 대안, 봇에 의해 제약

if (!(preg_match('/^[a-z]+$/i', $_POST['name']) xor preg_match('/^[а-я]+$/iu', $_POST['name']))) { 
    // error 
} 

당신은 하나의 정규식으로이 단축 될 수 있습니다 ^$.

\p{Latin}도 있으며 전체 문자 범위를 일치시키는 데 단지 \p{Cyrillic}이 아닙니다. 당신의 상태와

0

, 통과하지 않는 "경우"그들이 당신이 원하는 것은 더욱이 XOR

!(A or B) <=> !A && !B 동일하기 때문으로가, 두 번째는 하나, 당신은 단지 하나의 문자를 첫 번째 테스트하지 않을 경우 " preg match "여기.

당신의 상태는

if(preg_match('/^[a-z]+$/iu',$_POST['name']) xor preg_match('/^[а-я]+$/iu',$_POST['name']){ 

    // do what you want 

    } 
+0

이것이 내가이 문제를 해결하려고 시도한 두 가지 변형이라고 말한 이유입니다. –

+0

ok, xor를 사용하고 "+" – artragis