在 PHP 中使用正则表达式捕获和编辑部分字符串

Capture and edit part of string using regex in PHP

我必须检查几个字符串...每个字符串的格式可能如下:

I-IVWM_Ask-21_(max_2h)

D-7849_DG303_(max_4h)

Aliante_Privato

我需要捕获括号中的文本,括号外的字符串的第一部分,并将下划线替换为空格。

我想在PHP中使用preg_match,如下

preg_replace('/\([^)]*\)|[()]/', '', $string);

上面的代码删除了字符串和括号但保留了下划线并且没有捕获括号内的字符串。

对解决我的问题有什么帮助吗? 谢谢

您可能要做的是首先匹配模式,然后使用 preg_replace_callback.

将括号和下划线替换为 space

匹配字符串的模式:

^[^\s()]+(?:\([^()]*\))?$
  • ^ 字符串开头
  • [^\s()]+ 匹配除括号或白色以外的 1+ 个字符space 字符
  • (?:\([^()]*\))? 可选匹配括号之间的部分
  • $ 字符串结束

Regex demo | Php demo

例如

$strings = [
    "I-IVWM_Ask-21_(max_2h)",
    "D-7849_DG303_(max_4h)",
    "Aliante_Privato"
];

foreach ($strings as $str) {
    $pattern = "/^[^\s()]+(?:\([^()]*\))?$/";
    echo preg_replace_callback($pattern, function ($x) {
        return trim(preg_replace("/[()_]+/", " ", $x[0]));
    }, $str) . PHP_EOL;
}

输出

I-IVWM Ask-21 max 2h
D-7849 DG303 max 4h
Aliante Privato
$strings = [
    "I-IVWM_Ask-21_(max_2h)",
    "D-7849_DG303_(max_4h)",
    "Aliante_Privato"
];

$result = array_map('trim', preg_filter('~[_()]+~', ' ', $strings));