2013-06-17 1 views
1

letters and only을 허용하는 변수를 지정하려면 digits이 아닌 값을 사용하십시오.[a-zA-Z]가 숫자와 문자를 모두 비교하는 이유는 무엇입니까?

변수는 문자열의 어느 위치 에나있을 수 있습니다.

이것 봐, 변수가 문자를 포함하면

$pattern = '~user/(:var)~'; 

$pattern = str_replace('(:var)', '([a-zA-Z])', $pattern); 

// Note, the variable contain both numbers and letters 
$test = 'user/dave123'; 

$r = preg_match($pattern, $test); 

var_dump($r); //1 Success (I don't want this) 

내가 원하는 건이며,

만, 다음 preg_match()가 반환해야 1, 하지만 하나는 적어도 하나의 숫자를 포함하는 경우 preg_match()은 즉시 0을 반환해야합니다.

([a-zA-Z]) 대신에 regex을 정의해야하며 이유는 ([a-zA-Z])은 숫자와 문자를 모두 찾습니다!

+2

정규식을 하드 코딩 해 봤니? '$ 패턴 '을 생성하여 정규식이 예상대로 생성되었음을 확인 했습니까? –

답변

6

정규 표현식이 테스트 값의 부분 문자열 인 user/d과 일치합니다.

당신이 시작 (^)과 끝 ($)를 추가, 전체 문자열에 대해 확인하려면

은 패턴에 앵커 :

$pattern = '~^user/(:var)$~'; 

은 문자열의 시작/종료에 대해 확인하려면 또는 다른 같은 / 구분 기호, 그것과 같을 것이다 : 이것은 문자열의 끝 또는 할 때까지 전체 가치를 고려하도록 강제

$pattern = '~(?:^|/)user/(:var)(?:$|/)~'; 

다음 / ... 귀하가 귀하의 질문에서 발생한 부분 일치를 방지합니다.

당신은 또한 [a-zA-Z] 클래스가 +으로 반복 할 수 있도록해야합니다

, 또는합니다 (?: 여분 () 그룹이 일치하여 결과 목록에서 끝나지 않을 것이라는 점을 의미하는 non-capturing group을 나타냅니다) 그것은 단지 하나의 문자 사용자 이름과 일치합니다 :

$pattern = str_replace('(:var)', '([a-zA-Z]+)', $pattern); 
+0

글쎄,'(: var)'는 결국에는 어떤 위치에있을 수 없으므로'$' – Yang

+0

'/ post/(: var)/comment/(: var)/replyid/(: var)', 이건 어때? – Yang

+0

@metal_fan, 나는 이것을 처리하기 위해 나의 대답을 업데이트했다. – jcsanyi

3

당신은 각각 ^$를 사용하여 결말을 시작 줄 필요가있다. 당신이 당신의 문자열에 user, dave을 가지고 있기 때문에

'~^user/(:var)$~' 

이 일치합니다.

0

패턴이 문자열의 첫 번째 문자와 일치하고 전체 문자열과 일치하지 않을 수 있습니다. 전체 문자열에 대해 일치하려면 당신에게 대소 문자를 구분 편지를 주어야한다

"/^[a-z]+$/i"

는 전체 문자열 (^$ 문자열의 시작과 문자열 구분 문자의 끝입니다)에 일치 시도 .

정확하게 똑같은 일을하는 ctype_alpha()과 같은 편리한 내장 PHP 함수가 있습니다.

+0

불가피합니다. ;)'''와'+'사이의 공백은 정규 표현식이 의미가 없기 때문에 오타라고 가정합니다. 당신은 오프닝'/'도 생략했다. –

+0

BTW, OP는 이제 문자열의 끝에서 일치가 항상 발생하지 않는다고 말합니다. 따라서'$'는하지 않습니다. –

1

귀하의 패턴은 "a-z 또는 A-Z 사이의 모든 문자 중 하나"를 의미하므로 일치합니다. 일치하는 내용이 인 지인지 여부를 확인하지 않으며 반복되는 문자와 일치하지 않습니다.

그런 접근 방식 대신, 더 간단한 것을 시도해보십시오. 문자열에 숫자가 포함되어 있는지 여부를 알고 싶은 것이므로

$haystack = 'user/dave123'; 
foreach(range(0,9) as $i) { 
    if (strpos($haystack,$i) === FALSE)) { 
     return 1; 
    } 
} 
return 0; 

발견 된 첫 번째 숫자에서 중지합니다.

+0

해당 범위 사이에있는 문자 중 하나입니다. –

+0

wait ...'strpos()'는'INT' 또는'FALSE'를 반환하지만 결코 TRUE를 반환하지 않습니다. – Yang

+0

바로 metal_fan이므로 업데이트하겠습니다. –

관련 문제