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の後に 1 つまたは複数の非文字[^A-Za-z]が続き、その後に 1 つまたは複数の文字または空白 (複数の単語を説明するため) が続く表現に一致します[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関数は、最初の引数として区切り文字を受け入れます。

配列の爆発(string $delimiter , string $string [, int $limit ] )

つまり、「最初の文字と見つかった最初の整数の間」のような複雑な規則を理解するほど「スマート」ではないことを意味します。「'1' で分割する」または「'A' で分割する」などのことしか理解できません。区切り文字は具体的なものでなければなりません。たとえば、特定の文字と特定の整数です。(つまり、「文字 'B' と整数 '4' の間」)

あなたが説明したような(「最初の文字と見つかった最初の整数の間」)、より抽象的な/一般的なものについては、パターンが必要になります。したがって、最善の策は、代わりにpreg_replaceorを使用することです。preg_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 に答える