2014-06-12 23 views
1

我已經寫了下面的代碼來檢查給定的字符串是拉丁語還是包含一些其他非拉丁字符如波斯語。問題是,它總是爲以下兩個字符串返回true:我需要一個正則表達式來匹配拉丁字符,而不是其他字符

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

或者

$str = "Hello, سلام" 

雖然第二個字符串,因爲它包含波斯字符(非拉丁)也應該返回false 。如果字符串包含零個或多個您指定的字符

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

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

回答

5

你的模式將返回true。換句話說,它將在任何字符串中返回true。您需要在其周圍放置開始(^)和結束($)錨。你也不必逃避大多數這些字符(字符類使它們被作爲文字字符處理):

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

但是,這將匹配一個空字符串。爲確保字符串不爲空,請使用+量詞(一個或多個)而不是*

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

非常感謝。我做了半拉子匹配:D ....你的回答讓很多事情清楚 –

+0

太糟糕了,他不想要所有基本的ASCII字符......看着桌子,我看到我們可以用一個整齊的'^ [ - 〜] + $':) +1 – zx81

相關問題