1

给定

$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]。与'.[2] 进入团队和 [1] 进入得分..

这工作正常,除非团队名称中有空格,或者 () 中有额外的文本。

那么这可以使用 preg_match 来完成吗?

谢谢

4

2 回答 2

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

然后,您可以进一步过滤第一个和第三个结果以删除垃圾。不幸的是,你没有给出处理垃圾的具体规则。如果团队和分数之间可能存在垃圾,除非您知道自己在寻找什么,否则可能很难将其清除。我也不确定是否\d+-\d+可以出现在除分数之外的字符串中的任何位置。

另一种可能是

preg_match('/([a-z\.\s]+)(\d+-\d+)([a-z\.\s]+)/i', $str, $matches);

...将三件物品存放在其中$matches并清除垃圾。但是,它不允许团队名称中包含数字,并且不会修剪尾随/前导空格。

于 2013-04-02T02:28:08.967 回答
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介绍的。

于 2013-04-02T02:29:40.583 回答