2013-04-17 70 views
3

我正在嘗試爲任何給定的字符串創建正則表達式。正則表達式 - preg_match拉丁和希臘字符

目標:刪除所有字符,這是不是 「拉丁」 或 「小寫希臘」 或 「數字」。

我到目前爲止做了什麼:[^a-z0-9]
這對於拉丁字符非常適用。

當我嘗試這個:[^a-z0-9α-ω]沒有運氣。工作,但沒有任何其他符號像!!#$%@%#$ @,`

我的知識是有限的,當涉及正則表達式。任何幫助將非常感激!

編輯:
發佈以下是匹配指定的字符,並創建一個塞出來,用破折號作爲分隔符的功能:

 $q_separator = preg_quote('-'); 
     $trans = array(
      '&.+?;'     => '', 
      '[^a-z0-9 -]'   => '', 
      '\s+'     => $separator, 
      '('.$q_separator.')+' => $separator 
     ); 

     $str = strip_tags($str); 

     foreach ($trans as $key => $val){ 
      $str = preg_replace("#".$key."#i", $val, $str); 
     } 

     if ($lowercase === TRUE){ 
      $str = strtolower($str); 
     } 

     return trim($str, '-'); 

因此,如果字符串是:的OnCE !曾幾何時#%@墨西哥
使用功能$$輸出將是:一次後,一時間,在墨西哥

這工作正常,但我想preg_match也排除希臘字符。

+0

每個操作系統preg_match的重複問題? – mallix

+0

他有一個很好的解決方案.. –

回答

6

好的,這可以代替你的功能嗎?

$subject = 'OnCEΨΩ é[email protected]àupon</span> aαθ tIME !#%@$ in MEXIco in the year 1874 <or 1875'; 

function format($str, $excludeRE = '/[^a-z0-9]+/u', $separator = '-') { 
    $str = strip_tags($str); 
    $str = strtolower($str); 
    $str = preg_replace($excludeRE, $separator, $str); 
    $str = trim($str, $separator); 
    return $str; 
} 
echo format($subject); 

注意,你會<(用strip_tags的原因)後失去所有的字符,直到你遇到一個>


//舊的答案時,我因子評分你想保留希臘字符

可以建立一個角色範圍,如α-ω或任何你想要的奇怪角色!你的模式不起作用的原因是你不會通知正在處理unicode字符串的正則表達式引擎。要做到這一點,您必須在模式結尾添加u修飾符。這樣的:

/[^a-z0-9α-ω]+/u 

您可以使用字符的十六進制代碼太:

/[^a-z0-9\x{3B1}-\x{3C9}]+/u 

請注意,如果你一定不要有或想保留,在字符串中大寫的希臘字符,你可以使用字符類\p{Greek}這樣的:

/[^a-z0-9\p{Greek}]+/u 

(這是長一點,但更明確的)

+0

第一個解決方案工作,但符號仍然存在 第二個解決方案錯誤:編譯失敗:\ x {...}序列中的字符值在偏移量15處太大012,第三個解決方案工作,但符號仍然有 – mallix

+0

用一些代碼更新了我的問題 – mallix

+0

好的,現在更清楚了 –

2

有已經關於此問題的回答的問題:

Remove Non English Characters PHP

你不能指定一個範圍,如α-ω但你需要使用例如他們的代碼\ 00- \ 255

+0

我在哪裏可以找到希臘字符的代碼。或者結合字符範圍或類似的東西 – mallix

相關問題