【问题标题】:Programmatically replace values' presentation in PHP array以编程方式替换 PHP 数组中的值的表示形式
【发布时间】:2014-09-15 00:13:06
【问题描述】:

我有这些卷变量名称。在将它们呈现给用户之前,需要对其进行“修饰”。

$unit[] = 'cm3';
$unit[] = 'barrel_petrolium';
$unit[] = 'register_tons';
$unit[] = 'ocean_tons';
$unit[] = 'gal_us';
$unit[] = 'gal_uk';
  1. 3 需要转换成 ³
  2. _ 需要转换为一个空格
  3. 当结尾有_xx时,需要转换成(XX)

前两条规则我没有问题。我怎样才能应用第三条规则?

# replacements
$search  = array('3', '_');
$replace = array('³', ' ');

# units
$temp = str_replace($search, $replace, $unit); //1st and 2nd rules

$formatted[] = $temp;
print_r($formatted);

结果是:

cm³
barrel petrolium
register tons
ocean tons
gal us
gal uk

应该是:

cm³
barrel petrolium
register tons
ocean tons
gal (US)
gal (UK)

有什么想法吗? 谢谢!

【问题讨论】:

    标签: php preg-replace str-replace


    【解决方案1】:

    你可以使用 preg_replace_callback:

    $unit[] = 'cm3';
    $unit[] = 'barrel_petrolium';
    $unit[] = 'register_tons';
    $unit[] = 'ocean_tons';
    $unit[] = 'gal_us';
    $unit[] = 'gal_uk';
    
    $result = array_map(function ($item) {
      $item = preg_replace_callback('~_\K[a-z]{2}\z~', function ($m) {
        return '(' . strtoupper($m[0]) . ')';
      }, $item);
      return strtr($item, array('3' => '³', '_' => ' '));
    }, $unit);
    
    print_r($result);
    

    图案细节:

    ~          # pattern delimiter
    _          # literal _
    \K         # keep out all on the left (the underscore here)
    [a-z]{2}   # two lowercase letters
    \z         # anchor for the end of the string
    ~          # delimiter
    

    使用\K 功能,只会替换末尾的两个字母。下划线的替换是strtr()的工作(一个字符翻译功能等等

    【讨论】:

    • 由于我的设置数组比示例稍微复杂一些,因此我不得不将您的解决方案与 preg_replace 一起使用。谢谢!
    • @andufo:而不是什么?而不是 strtr?
    • preg_replace 而不是 preg_replace_callback。
    • @andufo:这不适用于preg_replace,因为第二个参数只能是字符串。 preg_replace_callback 的主要兴趣在于使用函数处理模式匹配并动态返回替换字符串的能力。
    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 2012-05-02
    • 1970-01-01
    • 2015-09-14
    • 2013-11-07
    • 1970-01-01
    • 2011-09-29
    • 2012-04-24
    相关资源
    最近更新 更多