2012-04-16 4 views
2

문자, 숫자, 공백, unserscore 및 하이픈 만 허용하고 싶습니다. Preg_match 문자열 내 특수 문자 유효성 확인

지금까지 나는이는 preg_match이 작업 할 것이라고 생각 :

if(preg_match('/[^a-z0-9 _]+$/i', $name)) { 
$error = "Name may only contain letters, numbers, spaces, \"_\" and \"-\"."; 
} 

을하지만 난 그냥 특수 문자가 문자열 내부 오류가 발생하지 않을 것을 깨달았다. 예를 들어

안녕하세요 "@ £ $ 조

오류가 발생하지 않을 것입니다. 조금 변경하고 그것이 작동되도록하거나, 내가 다른 솔루션을 필요로 할 수 있습니까?

답변

3

문제는 $ 기호입니다. 특별히 문자열 끝과 일치하도록 요청하고 있습니다. /[^a-z0-9 _]+$/ijoe[a-z0-9 _]+$과 일치하므로 hello"@£$joe과 일치하지 않습니다. 클래스를 무효화하면 분명히 일치하지 않게됩니다. $ 기호를 제거하고 모든 것이 예상대로 될 것입니다 :

if(preg_match('/[^a-z0-9 _]+/i', $name)) { 
// preg_match will return true if it finds 
// a character *other than* a-z, 0-9, space and _ 
// *anywhere* inside the string 
} 

자바 스크립트 콘솔에서 하나이 줄을 하나 붙여 넣기하여 브라우저에서 테스트를 :

/[^a-z0-9 _]+/i.test("@hello");  // true 
/[^a-z0-9 _]+/i.test("[email protected]");   // true 
/[^a-z0-9 _]+/i.test("hello\"@£$joe"); // true 
/[^a-z0-9 _]+/i.test("hello joe");  // false 
+0

고맙습니다. – 2by

+0

정말 감사합니다. –

0

당신은 문자 클래스 밖에서 ^을 가지고해야합니다

if(preg_match('/^[a-z0-9 _]+$/i', $name)) { 

내부의 ^ (처음에) 문자 클래스 문자 클래스 부정 자처럼 행동합니다.

+0

죄송하지만이 – 2by

0
/^([a-z]|[A-Z]|[0-9]| |_|-)+$/ 

사용이 정규 표현식 여기

+0

왜 작동하지 않습니다 한 클래스에 모든 것을 넣지 않습니까? '[-_ a-zA-Z0-9]' – ThiefMaster

+0

미안하지만, 이것도 작동하지 않습니다 – 2by

0

는이 걸릴 :

/^[a-z0-9\s\-_]+$/i 

이 표현은 더미 데이터와 나에 의해 테스트됩니다.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
<script> 
function valueanalysis(form){ 
    var vals = form.vals.value; 

    alert(/^[a-z0-9\s\-_]+$/i.test(vals)); 

    return false; 
} 
</script> 
</head> 

<body> 
<form onsubmit="return valueanalysis(this);"> 
<input type="text" name="vals"/> 
<input type="submit" value="Check" /> 
</form> 
</body> 
</html> 

html 파일에서이 코드를 사용하여 값을 채우고 유효성을 검사 한 다음 Enter 키를 눌러 true 또는 그렇지 않은지 확인하십시오.

참고 : - 정규 표현식은 모든 언어에서 동일합니다.

<?php 


if(preg_match("/^[a-z0-9\s\-_]+$/i","ASDhello-dasd asddasd_dsad")){ 
    echo "true"; 
} 
else{ 
    echo "false"; 
} 
?> 
+1

미안하지만이 일을 할 수 없습니다 – 2by

+0

내 사건에 잘 작동하는 일부 일을 잘못하고 있습니다. 각각의 모든 가치가 올바르게 작동합니다. 대답에서이 편집을 사용하십시오. –

+0

흠, 그렇지 않으면 내가 코드를 테스트 할 때 작동합니다. 그러나 PHP를 사용할 때 이것은 작동합니다 :'if (preg_match ('/^[a-z0-9 \ s \-] + $/i', $ name)) { $ error = "이름은 문자 , 숫자, 공백, \ "_ \"및 \ "- \". "; }' – 2by