给出
$str=array( "Chelsea 0-5 MAN-UNITED",
"Chelsea 0-2 Aston Villa",
"Chelsea 0-3 Pokemon (TRASH i dont want)");
输出我试图达到:
array(
array('teams'=>'chelsea Vs MAN-UNITED','score'=>'0-5')
array('teams'=>'chelsea Vs Aston Villa','score'=>'0-2')
array('teams'=>'chelsea Vs Pokemon','score'=>'0-3')
);
我目前的方法是使用explode('',$ str);然后移动[0]。' Vs'。[2]进入队伍并[1]进入得分......
工作正常,除非团队名称中有空格,或者在()内有额外的文本。
这样可以使用preg_match吗?
感谢
答案 0 :(得分:3)
您可以使用
preg_split('/ (\d+-\d+) /', $str, 3, PREG_SPLIT_DELIM_CAPTURE);
这会将您想要的三个段放入一个数组中。在上面的第一个例子中:
array(3) {
[0] =>
string(8) "Chelsea"
[1] =>
string(3) "0-5"
[2] =>
string(11) "MAN-UNITED"
}
然后,您可以进一步过滤第1和第3个结果以删除垃圾。不幸的是,您没有给出处理垃圾的具体规则。如果团队和分数之间可能存在垃圾,除非您知道自己在寻找什么,否则可能很难将其删除。我也不确定\d+-\d+
是否可以出现在除分数之外的字符串中的任何位置。
另一种可能性是
preg_match('/([a-z\.\s]+)(\d+-\d+)([a-z\.\s]+)/i', $str, $matches);
...将这三个项目存储在$matches
中并删除垃圾。但是,它不允许团队名称中的数字,也不会修剪尾随/前导空格。
答案 1 :(得分:1)
试试这个:
$str=array( "Chelsea 0-5 MAN-UNITED",
"Chelsea 0-2 Aston Villa",
"Chelsea 0-3 Pokemon (TRASH i dont want)");
$arr = array();
$pattern = "/([0-9]+\-[0-9]+)/";
foreach ($str as $sub) {
$parts = preg_split($pattern, $sub, -1, PREG_SPLIT_DELIM_CAPTURE);
if (count($parts) == 3) {
$team1 = trim(preg_replace("/\(.*\Z/", "", $parts[0]));
$score = trim($parts[1]);
$team2 = trim(preg_replace("/\(.*\Z/", "", $parts[2]));
$teams = "$team1 Vs $team2";
$element = array("teams" => $teams, "score" => $score);
$arr[] = $element;
}
}
print_r($arr);
输入:
$str=array( "Chelsea 0-5 MAN-UNITED",
"Chelsea 0-2 Aston Villa",
"Chelsea 0-3 Pokemon (TRASH i dont want)");
输出:
Array
(
[0] => Array
(
[teams] => Chelsea Vs MAN-UNITED
[score] => 0-5
)
[1] => Array
(
[teams] => Chelsea Vs Aston Villa
[score] => 0-2
)
[2] => Array
(
[teams] => Chelsea Vs Pokemon
[score] => 0-3
)
)
这里有效:http://eval.in/14236
哦,确保你至少使用PHP 4.0.5。那是PREG_SPLIT_DELIM_CAPTURE
被引入的时候。