3

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

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

到目前为止我所做的: [^a-z0-9]
这非常适合拉丁字符。

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

当涉及到正则表达式时,我的知识是有限的。任何帮助将非常感激!

编辑:
下面发布的是匹配指定字符并从中创建一个 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, '-');  

因此,如果字符串是:OnCE on a tIME !#% @$$ in MEXico
使用该函数,输出将是:onCE on a tIME !#% @$$ in MEXico

这工作正常,但我希望 preg_match 也排除希腊字符。

4

2 回答 2

7

好的,这可以代替您的功能吗?

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

请注意,您将丢失 a 之后的所有字符<(由于 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

(它有点长但更明确)

于 2013-04-17T20:04:23.037 回答
2

已经有一个关于此的已回答问题:

删除非英文字符 PHP

您不能指定范围,例如 α-ω,但您需要使用它们的代码,例如 \00-\255

于 2013-04-17T16:00:10.827 回答