我正在尝试为任何给定的字符串创建正则表达式。
目标:删除所有不是“拉丁”或“小写希腊”或“数字的字符“。
到目前为止我做了什么:[^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 字符。
答案 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)