2013-04-17 71 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

相关问题