preg_replace通过提取方括号

时间:2017-09-19 14:26:22

标签: php regex

我在字符串上提取国家/地区的正常表达

的字符串

BRY AIR PVT LTD [IN] 
BRY AIR [ASIA] PVT LTD [IN]

方括号之间的最新子字符串有时存在,有时则不存在。

如果在最后一个单词之间存在espace,则此子字符串不是正常空格。是一个看不见的空间。

Sometines在最后作为一个不正确的附加空间

function extractNameAndCountry {
    $without = preg_replace('/[\W]*$/', '', preg_replace('/[\p{Z}\t]*(\[(.*?)\])?$/u', '', trim($string)));
    if (preg_match('/\[([^\)]*)\]/', $string, $matches)) {
        $country = $matches[1];
    }
}

extractNameAndCountry('BRY AIR PVT LTD [IN]');  
echo $without -> BRY AIR PVT LTD
echo $country -> IN

// Wrong result
extractNameAndCountry('BRY AIR [ASIA] PVT LTD [IN]');
echo $without -> BRY AIR
echo $country -> ASIA] PVT LTD [IN

我在http://rubular.com/https://regex101.com/尝试其他方式,但我不知道如何在结尾处仅提取第一个并发

1 个答案:

答案 0 :(得分:1)

您可以使用

preg_match('~^(.*?)\s*\[([^][]*)]\s*$~u', $s, $match)

<强>详情

  • ^ - 字符串开头
  • (.*?) - 除了换行符之外的任何0 +字符,尽可能少
  • \s* - 任何0+空格
  • \[ - 文字[
  • ([^][]*) - 第1组:[]字符以外的任何0 +字符
  • ] - 文字]
  • \s* - 0+ whitespaces
  • $ - 字符串结束。

查看PHP demo

$strs = ["BRY AIR PVT LTD [IN] ", "BRY AIR [ASIA] PVT LTD [IN]"];
foreach ($strs as $s) {
    if (preg_match('~^(.*?)\s*\[([^][]*)]\s*$~u', $s, $match)) {
        echo $match[1] . "<=>" . $match[2] . "\n";
    }
}

输出:

BRY AIR PVT LTD<=>IN
BRY AIR [ASIA] PVT LTD<=>IN

请注意,您可以