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