Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式-preg_匹配拉丁和希腊字符_Php_Regex_Preg Replace_Preg Match - Fatal编程技术网

Php 正则表达式-preg_匹配拉丁和希腊字符

Php 正则表达式-preg_匹配拉丁和希腊字符,php,regex,preg-replace,preg-match,Php,Regex,Preg Replace,Preg Match,我正在尝试为任何给定字符串创建正则表达式 目标:删除所有不是“拉丁语”或“小写希腊语”或“数字”的字符 到目前为止我所做的:[^a-z0-9] 这非常适合拉丁字符 当我尝试这个:[^a-z0-9α-ω]运气不好。可以工作,但省略了任何其他符号,如!!#$%@%#$@,` 关于regexp,我的知识有限。任何帮助都将不胜感激 编辑: 下面发布的是一个函数,它匹配指定的字符,并从中创建一个段塞,以破折号作为分隔字符: $q_separator = preg_quote('-');

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

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

到目前为止我所做的:
[^a-z0-9]

这非常适合拉丁字符

当我尝试这个:
[^a-z0-9α-ω]
运气不好。可以工作,但省略了任何其他符号,如!!#$%@%#$@,`

关于regexp,我的知识有限。任何帮助都将不胜感激

编辑:
下面发布的是一个函数,它匹配指定的字符,并从中创建一个段塞,以破折号作为分隔字符:

        $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, '-');  
因此,如果字符串是:很久以前!#%@$$在墨西哥
使用该功能,输出将为:墨西哥一次性


这很好,但我希望preg_匹配也排除希腊字符。

关于这一点,已经有一个问题得到了回答:


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

好的,这能代替您的函数吗

$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-z0-9\x{3B1}-\x{3C9}]+/u 
请注意,如果您确定字符串中不包含或不希望保留大写希腊字符,则可以像下面这样使用字符类
\p{Greek}

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

(稍微长一点,但更明确)

在哪里可以找到希腊字符的代码。或者将字符范围或类似的重复问题与每个操作系统的preg_匹配结合起来?他有一个很好的解决方案..第一个解决方案有效,但符号仍然存在..第二个解决方案错误:编译失败:字符值在\x{…}序列在偏移量15处太大第三个解决方案有效,但符号仍在更新。我的问题带有一些代码OK,现在更清楚的是,您的函数使用$excludeRE='/[^a-z0-9α-ω]++/u'工作。我需要测试每一个案例是否第一。
/[^a-z0-9\p{Greek}]+/u