【问题标题】:Convert string to array using regex [closed]使用正则表达式将字符串转换为数组 [关闭]
【发布时间】:2017-10-29 19:14:43
【问题描述】:

我有这个字符串:

$string = ["coffee candy (123456789) (Amount: 0.00 EUR)",
           "fruity candy (987654332) (Amount: 0.00 EUR)"];

我希望结果是这样的:

array(2) {
 [0] => array {
    ["name"] => string(12) coffee candy
    ["num"] => string(9) 123456789
    ["amount"] => string(15) Amount 0.00 EUR
 }
 [1] => array {
    ["name"] => string(12) fruity candy
    ["num"] => string(9) 987654332
    ["amount"] => string(15) Amount 0.00 EUR        
 }
}

或类似的东西。可以用正则表达式吗?如果有,怎么做?

【问题讨论】:

  • 向我们展示您为解决此问题尝试了哪些正则表达式。
  • 那个字符串已经是一个数组了
  • 这是一个字符串.. 请相信我。不幸的是,它以这种格式出现
  • 那么它可能是$string = '["coffee candy (123456789) (Amount: 0.00 EUR)","fruity candy (987654332) (Amount: 0.00 EUR)"]';(注意单引号),因为[]是array()的简写
  • 请阅读一些关于 PHP 和正则表达式的教程并展示您尝试过的内容,或者如果您只是想要一个解决方案,请聘请一名程序员。

标签: php arrays regex string


【解决方案1】:

我认为你需要这样的东西

<?php
$text = 'coffee candy (123456789) (Amount: 0.00 EUR)';

preg_match('/^([a-zA-Z\s]+)\s+?\(([\d]+)\)\s+?\((.+)\)/', $text, $matches);
print_r($matches);

【讨论】:

    【解决方案2】:

    你可以用char (炸开字符串,然后修剪),检查live demo

    <?php
    
    $string = ["coffee candy (123456789) (Amount: 0.00 EUR)",
               "fruity candy (987654332) (Amount: 0.00 EUR)"];
    $keys = ['name', 'num', 'amount'];          
    $array = array_map(function($v) use($keys) {
      $arr = explode('(', $v);
      $arr = array_map(function($v){
        return trim($v, " \t\n\r\0\x0B)");
      }, $arr);
      return array_combine($keys, $arr);
    }, $string);
    
    print_r($array);
    

    【讨论】:

      【解决方案3】:

      如果输入是一致的(机器生成的),我会放弃正则表达式并使用类似的东西

      $array = explode(',',$string);
      foreach($array as $data){
          $parts = explode('(',$data);
          $result[]['name'] = trim(substr($parts[0], 1));
          $result[]['num'] = trim(substr($parts[1], 0, -1));
          $result[]['amount'] = trim(substr($parts[2], 0, -2));
      }
      

      不过,这只适用于一致的字符串。

      【讨论】:

      • 请注意,如果其中一个部分包含,,比如"coffee candy (123456789) (Amount: 0.00 EUR)",这将产生意想不到的结果
      • 是的,因为 ',' 被用作标记,所以让它成为一个不一致的字符串会很糟糕。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 2021-09-16
      • 1970-01-01
      • 2012-01-28
      相关资源
      最近更新 更多