PHP在整数和字母之间爆炸

时间:2012-09-14 23:16:54

标签: php regex explode

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);
}

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

5 个答案:

答案 0 :(得分:6)

您可以使用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

答案 1 :(得分: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

答案 2 :(得分:3)

如果你想在第一个字母和第一个找到的整数之间爆炸,你不应该使用爆炸。

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

  

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

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

对于更抽象/更一般的内容,就像你描述的那样(“在第一个字母和第一个找到的整数之间”),你需要一个模式。最好的办法是使用preg_replacepreg_split代替like 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>";
}

?>

答案 3 :(得分:3)

你也可以在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 )

答案 4 :(得分:0)

这样的事情:

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
   )