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

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

4

5 回答 5

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].

这是一个演示

于 2012-09-14T23:24:13.643 回答
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

看到它工作

于 2012-09-14T23:27:43.467 回答
3

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

PHPexplode函数接受一个分隔符作为它的第一个参数:

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

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

对于更抽象/更一般的东西,比如你描述的(“在第一个字母和找到的第一个整数之间”),你需要一个模式。所以最好的办法是使用preg_replaceorpreg_split代替,像这样

<?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>";
}

?>
于 2012-09-14T23:33:03.970 回答
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 )
于 2012-09-14T23:36:21.550 回答
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
   )
于 2012-09-14T23:24:10.210 回答