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);
}
编辑:更新的示例。空间爆炸是行不通的。见上面的例子。
答案 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
答案 2 :(得分:3)
如果你想在第一个字母和第一个找到的整数之间爆炸,你不应该使用爆炸。
The PHP explode
function接受分隔符作为其第一个参数:
数组爆炸(字符串 $ delimiter ,字符串 $ string [,int $ limit ])
这意味着它不够“聪明”,无法理解复杂的规则,例如“在第一个字母和第一个整数之间找到” - 它只能理解“拆分为'1'”或“拆分为'A'”之类的事情。分隔符必须是具体的东西:例如,特定字母和特定整数。 (即“在字母'B'和整数'4'之间”)
对于更抽象/更一般的内容,就像你描述的那样(“在第一个字母和第一个找到的整数之间”),你需要一个模式。最好的办法是使用preg_replace
或preg_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
)