2014-06-12 5 views
1

주어진 문자열이 라틴어인지 또는 페르시아어와 같은 다른 비 라틴 문자가 들어 있는지 확인하기 위해 다음 코드를 작성했습니다.라틴 문자 만 일치 시키려면 RegExp가 필요합니다.

$str = "Hello, What's up?" 

아니면 페르시아 문자 (비 라틴어)도 포함하고 있기 때문에 두 번째 문자열을 false를 반환해야하지만

$str = "Hello, سلام" 

: 문제는 항상 다음과 같은 문자열 모두에 대해 true를 돌려주는 것입니다 . 문자열이 지정한 해당 문자의 0 개 이상의이 포함 된 경우

$default_rule = "/[a-zA-Z0-9\(\)\*_\-\!\#\$\%\^\&\*\,\.\"\'\]\[]*/"; 
    $rule = ($rule==null) ? $default_rule : $rule; 

    if(preg_match($rule, $str)==true) 
    { 
     // always returns true 
    } 

답변

5

귀하의 패턴은 true를 돌려줍니다. 즉, 에 대해서는 문자열을 모두 반환합니다. 당신은 start (^)와 end ($) 앵커를 둘 필요가 있습니다. 이 빈 문자열과 일치합니다,

$default_rule = '/^[a-zA-Z0-9()*_\-!#$%^&*,."\'\][]*$/'; 

을하지만 : 또한 당신이 그 문자의 대부분을 탈출 할 필요가 없습니다 (문자 클래스는 그들이 리터럴 문자로 취급됩니다). 문자열이 비어 있지 않은지 확인하려면 * 대신 + 수량 기호 (하나 이상)를 사용하십시오.

$default_rule = '/^[a-zA-Z0-9()*_\-!#$%^&*,."\'\][]+$/'; 
+0

감사합니다. 나는 semi-lazi match를했다 : D .... 당신의 대답은 많은 것들을 분명하게 만들었지 만 –

+0

그는 모든 기본적인 ASCII 문자들을 원하지 않는다고 나쁘다 ... 테이블을 보면서, 나는 우리가 깔끔하게 갈 수 있음을 알았다.^[ - ~] + $':) +1 – zx81