PHP SEO URL正则适配西里尔文问题求助
解决PHP SEO友好URL支持西里尔字符的问题
嘿,我明白你的痛点——原函数只照顾了拉丁字符,西里尔文直接被过滤掉了对吧?别担心,咱们只需要调整正则表达式和字符串转小写的方式,就能完美支持非拉丁字符了。
问题分析
原正则 /[^a-z0-9_\s-]/ 只匹配ASCII范围内的字母和数字,完全不识别Unicode字符(比如西里尔文),所以会把它们直接删掉。另外,strtolower() 对Unicode字符的转小写支持也不好,得换成多字节版本的函数。
修改后的完整函数
function seoUrl($string) { // 转为小写,支持Unicode字符(指定UTF-8编码) $string = mb_strtolower($string, 'UTF-8'); // 保留Unicode字母、数字、下划线、空格和短横线,过滤其他字符 $string = preg_replace('/[^\p{L}\p{N}_\s-]/u', '', $string); // 把连续的空格或短横线替换成单个空格 $string = preg_replace('/[\s-]+/', ' ', $string); // 把空格替换成短横线(SEO友好的分隔符) $string = preg_replace('/[\s]/', '-', $string); // 去除首尾的短横线(如果有的话) $string = trim($string, '-'); return $string; }
关键改动说明
- 替换
strtolower()为mb_strtolower():strtolower()只能处理ASCII字符,mb_strtolower()支持多字节编码,指定UTF-8能确保西里尔文等Unicode字符正确转小写。 - 更新正则表达式:
\p{L}:匹配任意Unicode字母(包括西里尔、拉丁、希腊等所有语言的字母)\p{N}:匹配任意Unicode数字- 末尾的
u修饰符:启用正则的Unicode模式,让引擎正确解析Unicode字符集
- 其他逻辑保持不变,依然负责清理多余分隔符、替换空格为短横线,保证URL的整洁性。
测试示例
输入:Привет Мир! Это тест URL с кириллицей
输出:привет-мир-это-тест-url-с-кириллицей
这样处理后的URL既保留了西里尔字符的可读性,又符合SEO友好的格式要求~
内容的提问来源于stack exchange,提问作者Vesselina Taneva
相关产品推荐
相关产品推荐

