正则表达式 - preg_match拉丁语和希腊语字符

时间:2013-04-17 15:56:15

标签: php regex preg-replace preg-match

我正在尝试为任何给定的字符串创建正则表达式。

目标:删除所有不是“拉丁”或“小写希腊”或“数字的字符“。

到目前为止我做了什么:[^a-z0-9]
这适用于拉丁字符。

当我尝试这个时:[^a-z0-9α-ω]没有运气。 Works但是没有留下任何其他符号,比如!!#$%@%#$ @,`

在regexp方面,我的知识有限。任何帮助将非常感激!

修改
下面发布的是匹配指定字符的函数,并用它创建一个slug,用破折号作为分隔符:

        $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, '-');  

因此,如果字符串是:在TIME上的OnCE!MEXIco中的#%@ $$
使用该功能输出将是:一次一次在墨西哥

这很好但我希望preg_match也排除 greek 字符。

2 个答案:

答案 0 :(得分:6)

好的,这可以取代你的功能吗?

$subject = 'OnCEΨΩ é-+@à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

你也可以使用chars十六进制代码:

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

请注意,如果您确定没有或想要保留字符串中的大写希腊语字符,则可以使用字符类\p{Greek},如下所示:

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

(它有点长,但更明确)

答案 1 :(得分:2)

已经有一个回答的问题:

Remove Non English Characters PHP

您无法指定范围,例如α-ω,但您需要使用其代码,例如\ 00- \ 255