如何用正则表达式移除字符串中以EN/开头的语言代码片段?
解决方案与正则基础讲解
正确的PHP代码实现
要删除以EN/开头的语言代码片段,直接用preg_replace一步完成即可,不需要先匹配再替换:
$string = 'some string EN/DE/FR/IT/JA/ES some string'; // 匹配并删除目标语言代码片段 $final_string = preg_replace('/EN(?:\/[A-Z]{2})+/', '', $string); echo $final_string; // 输出:some string some string
正则表达式拆解
上面用的正则/EN(?:\/[A-Z]{2})+/各部分含义:
EN:匹配固定开头的字面量"EN"(?:\/[A-Z]{2}):非捕获组,打包一组规则:\/:转义后匹配实际的"/"(因为/是正则的分隔符,必须转义才能表示字面量)[A-Z]{2}:匹配任意两位大写字母(对应DE、FR这类语言代码)
+:表示前面的非捕获组至少出现1次,也就是EN/后面可以跟着1个或多个/XX格式的语言代码,刚好覆盖EN/DE、EN/DE/FR这类任意长度的目标片段
基础正则知识快速梳理
- 字面量匹配:普通字符(如字母、数字)直接写就能匹配对应的字符串,比如
abc匹配"abc" - 转义字符:如果要匹配
*、/、(这类有特殊含义的字符,需要在前面加\,比如\*匹配实际的"*" - 字符类:用
[]定义一组可匹配的字符,比如[A-Z]匹配任意大写字母,[0-9]匹配任意数字 - 量词:控制前面规则的匹配次数:
+:至少匹配1次*:匹配0次或多次?:匹配0次或1次{n}:恰好匹配n次
- 捕获组与非捕获组:
(...)是捕获组,会保存组内的匹配结果,方便后续引用(?:...)是非捕获组,仅用来把规则打包成整体,不会保存匹配结果,性能更优,适合不需要单独引用组内容的场景
原代码的问题说明
preg_match的返回值是匹配成功的次数(0或1),不是处理后的字符串,不能直接赋值给$new_string- 原正则
/- (.*?)/和需求完全不相关,它是匹配以" - "开头的任意短文本 - 不需要先匹配再用
str_replace,preg_replace可以直接完成匹配+替换的操作
内容的提问来源于stack exchange,提问作者LeGerman
相关产品推荐
相关产品推荐

