You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式移除字符串中以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次
  • 捕获组与非捕获组:
    • (...)是捕获组,会保存组内的匹配结果,方便后续引用
    • (?:...)是非捕获组,仅用来把规则打包成整体,不会保存匹配结果,性能更优,适合不需要单独引用组内容的场景

原代码的问题说明

  1. preg_match的返回值是匹配成功的次数(0或1),不是处理后的字符串,不能直接赋值给$new_string
  2. 原正则/- (.*?)/和需求完全不相关,它是匹配以" - "开头的任意短文本
  3. 不需要先匹配再用str_replace,preg_replace可以直接完成匹配+替换的操作

内容的提问来源于stack exchange,提问作者LeGerman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:10:24