【问题标题】:How to remove currency abbreviations from right side of strings?如何从字符串右侧删除货币缩写?
【发布时间】:2026-02-18 15:35:01
【问题描述】:

我有一个这样的示例数组:

[
  "BTCUSD",
  "DASHBTC",
  "DOGEUSD",
  "LTCBTC",
  "LTCUSD",
  "SCBTC",
  "STEEMBTC",
  "WAVESBTC",
  "SNGLSBTC",
  "1STBTC",
  "DASHUSD",
  "BQXETH",
  "PTOYETH",
  "XAURETH",
  "BTCUSDT"
]

如何为每个字符串只获取一种货币?我不能使用explode,因为没有单个/静态分隔符。我不能使用substr()strpos(),因为子字符串不同。

那么如何拆分呢?

更新

这是我的预期输出

[
   "BTC",
   "DASH",
   "DOGE",
   "LTC",
   "LTC",
   "SC",
   "STEEM",
   "WAVES",
   "SNGLS",
   "1ST",
   "DASH",
   "BQX",
   "PTOY",
   "XAUR",
   "BTC"
]

【问题讨论】:

  • 这个问题有很多标签,但只有 1 个项目列表....发布您的预期输出和您当前得到的输出...发布您的代码的相关部分并描述您遇到的错误得到...
  • 你的 PHP 代码在哪里?
  • 那么如果我认为"SCBTC" SCBTC 应该是两个不同的字符串?
  • 你需要一个货币数组来比较。

标签: php replace substring trailing


【解决方案1】:

您需要为您的预期货币提供一个数组,然后对其进行过滤。

这是一个快速而肮脏的解决方案:https://3v4l.org/6mMbN 或使用递归函数调用:https://3v4l.org/mhjBD

<?php

$currencies = [
    'USD',
    'BTC',
    'DASH',
    'LTC',
    'SC',
    'STEEM',
    'WAVES',
    'SNGLS',
    '1ST',
    'BQX',
    'ETH',
    'PTOY',
    'XAUR',
    ];

$input = [
  "BTCUSD",
  "DASHBTC",
  "DOGEUSD",
  "LTCBTC",
  "LTCUSD",
  "SCBTC",
  "STEEMBTC",
  "WAVESBTC",
  "SNGLSBTC",
  "1STBTC",
  "DASHUSD",
  "BQXETH",
  "PTOYETH",
  "XAURETH",
  "BTCUSDT",
];

$output=[];
foreach($input as $doubleCurrency){
    foreach($currencies as $currency){
        $pattern = '/^'.$currency. '/';
        preg_match($pattern, $doubleCurrency, $matches);
        if(array_key_exists(0, $matches)){
            $output[]=$matches[0];
        }
    }
}

var_dump($output);

【讨论】:

    【解决方案2】:

    这是一个类似于 Edwin 的答案,但可能更快。
    我使用 str_replace 在货币之间创建一个空格,然后循环新数组并删除第一个空格之后的任何内容。

    示例:
    'STEEMBTC' 成为 STEEM BTC'。
    然后将其替换为:'STEEM'。

    可能更快的代码,因为它循环更少并且不使用正则表达式。

    $currencies = [
      'USD',
      'BTC',
      'DASH',
      'LTC',
      'SC',
      'STEEM',
      'WAVES',
      'SNGLS',
      '1ST',
      'BQX',
      'ETH',
      'PTOY',
      'XAUR',
      'DOGE'
    ];
    
    $repl = [
      'USD ',
      'BTC ',
      'DASH ',
      'LTC ',
      'SC ',
      'STEEM ',
      'WAVES ',
      'SNGLS ',
      '1ST ',
      'BQX ',
      'ETH ',
      'PTOY ',
      'XAUR ',
      'DOGE '
    ];
    
    $input = [
      "BTCUSD",
      "DASHBTC",
      "DOGEUSD",
      "LTCBTC",
      "LTCUSD",
      "SCBTC",
      "STEEMBTC",
      "WAVESBTC",
      "SNGLSBTC",
      "1STBTC",
      "DASHUSD",
      "BQXETH",
      "PTOYETH",
      "XAURETH",
      "BTCUSDT",
    ];
    
    $new = str_replace($currencies, $repl, $input);
    Foreach($new as &$item){
        $item = substr($item, 0, strpos($item, " "));
    }
    
    Var_dump($new);
    

    https://3v4l.org/QDMjS

    【讨论】:

      【解决方案3】:

      您总是修剪字符串的右侧,只需将preg_replace() 与字符串锚点一起使用。不需要查找数组。这并不容易:

      代码:(Demo)

      $input=[
        "BTCUSD",
        "DASHBTC",
        "DOGEUSD",
        "LTCBTC",
        "LTCUSD",
        "SCBTC",
        "STEEMBTC",
        "WAVESBTC",
        "SNGLSBTC",
        "1STBTC",
        "DASHUSD",
        "BQXETH",
        "PTOYETH",
        "XAURETH",
        "BTCUSDT"
      ];
      
      var_export(preg_replace('/USDT$|USD$|ETH$|BTC$/','',$input));
      

      输出:

      array (
        0 => 'BTC',
        1 => 'DASH',
        2 => 'DOGE',
        3 => 'LTC',
        4 => 'LTC',
        5 => 'SC',
        6 => 'STEEM',
        7 => 'WAVES',
        8 => 'SNGLS',
        9 => '1ST',
        10 => 'DASH',
        11 => 'BQX',
        12 => 'PTOY',
        13 => 'XAUR',
        14 => 'BTC',
      )
      

      (如果你不介意语法,可以压缩模式。/USDT?$|ETH$|BTC$/ 快一点。)

      【讨论】:

      • 这很酷,但我仍然会使用货币数组,然后将其平展为模式。
      • 你可以。我不会。感谢您的 +1。