【问题标题】:PHP Explode between an integer and letterPHP 在整数和字母之间爆炸
【发布时间】:2012-09-14 23:16:53
【问题描述】:
array (    
    [0] => 3 / 4 Bananas
    [1] => 1 / 7 Apples
    [2] => 3 / 3 Kiwis
    )

是否可以说,遍历这个列表,并在找到的第一个字母和第一个整数之间找到explode,这样我就可以将文本与一组数字分开,最终得到如下内容:

array (
   [0] => Bananas
   [1] => Apples
   [2] => Kiwis
   )

我不知道您将如何将其指定为分隔符。有可能吗?

foreach ($fruit_array as $line) {
   $var = explode("??", $line);
}

编辑:更新示例。按空间爆炸是行不通的。见上面的例子。

【问题讨论】:

  • 列表的格式是什么,是字符串还是数组?

标签: php regex explode


【解决方案1】:

您可以使用preg_match 代替explode

$fruit_array = array("3 / 4 Bananas", "1 / 7 Apples", "3 / 3 Kiwis");
$result = array();
foreach ($fruit_array as $line) {
   preg_match("/\d[^A-Za-z]+([A-Za-z\s]+)/", $line, $match);
   array_push($result, $match[1]);
}

它几乎会完全匹配您的表达方式,即一个数字\d,后跟一个或多个非字母[^A-Za-z],后跟一个或多个字母或空格(以考虑多个单词)[A-Za-z\s]+ .括号之间的最终匹配字符串将在第一个匹配项中捕获,即$match[1]

这是一个DEMO

【讨论】:

  • 如果水果名称有两个单词,比如Green Apples,会怎样?您的示例将仅匹配 Green
  • @Norse:只需在[A-Za-z] 中添加一个额外的\s 以匹配空格。这样,它也匹配多个单词。我已经编辑了我的答案和我的演示。
  • 也谢谢你的解释
【解决方案2】:

您也可以在 preg_match 中使用 PREG_OFFSET_CAPTURE 标志:

$a = array('1/4 banana', '3/5 apple', '3/2 peach');

foreach ($a as $b) {
    preg_match('/[a-z]/', $b, $matches, PREG_OFFSET_CAPTURE);
    $pos = $matches[0][1]; // position of first match of [a-z] in each case
    $c[] = substr($b, $pos);  
}

print_r($c);


Array ( [0] => banana [1] => apple [2] => peach )

【讨论】:

    【解决方案3】:
    // An array to hold the result
    $result = array();
    
    // Loop the input array
    foreach ($array as $str) {
    
      // Split the string to a maximum of 2 parts
      // See below for regex description
      $parts = preg_split('/\d\s*(?=[a-z])/i', $str, 2);
    
      // Push the last part of the split string onto the result array
      $result[] = array_pop($parts);
    
    }
    
    // Display the result
    print_r($result);
    

    正则表达式的工作方式如下:

    /
      # Match any digit
      \d
      # Match 0 or more whitespace characters
      \s*
      # Assert that the next character is a letter without including it in the delimiter
      (?=[a-z])
    /i
    

    See it working

    【讨论】:

      【解决方案4】:

      如果您想在“找到的第一个字母和第一个整数之间”进行分解,则不应使用explode。

      The PHP explode function 接受分隔符作为其第一个参数:

      数组 explode ( 字符串 $delimiter , 字符串 $string [, int $limit ] )

      这意味着它不够“聪明”,无法理解“在第一个字母和找到的第一个整数之间”这样的复杂规则——它只能理解“在 '1' 上分割”或“在 'A' 上分割”这样的东西。分隔符必须是具体的:例如,特定的字母和特定的整数。 (即“在字母'B'和整数'4'之间”)

      对于更抽象/通用的内容,例如您所描述的内容(“在第一个字母和找到的第一个整数之间”),您将需要一个模式。所以最好的办法是改用preg_replacepreg_splitlike so

      <?php
      
      $myArr = [    
          "3 / 4 Bananas",
          "1 / 7 Apples",
          "3 / 3 Kiwis",
          "1 / 7 Green Apples",
      ];
      
      for($i=0; $i<count($myArr); $i++) {
          echo "<pre>";
          echo preg_replace("/^.*?\d[^\d[a-z]]*([a-z])/i", "$1", $myArr[$i]);
          echo "</pre>";
      }
      
      ?>
      

      【讨论】:

        【解决方案5】:

        类似这样的:

        foreach ($fruit_array as $line) {
           $var = explode(" ", $line);
           $arr[$var[2]] = $var[3];
        }
        
        var_dump( $arr ) should output:
        
        array (
           [0] => Bananas
           [1] => Apples
           [2] => Kiwis
           )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多