PHP Regex在任意数量的单词和1-3位数字后更正语法preg_split


PHP Regex correct syntax preg_split after any number of words and 1-3 digits

我正试图用体育成绩分解rss提要

示例数据

San Diego 4 Chicago Cubs 2
Miami 2 Philadelphia 7
Boston 3 Toronto 1
Washington 3 Atlanta 1
Chicago Sox 3 Texas 1
St. Louis 6 Milwaukee 5 

rss基本上给了我一个像San Diego 4 Chicago Cubs 2这样流动的字符串,我正试图将其分解以更好地使用。

基本上,我试图首先将San Diego 4 Chicago Cubs 2划分为四个变量,$home_team$home_score$away_team$away_score

但是,很明显,主队可以是一个单词或多个单词,分数可以是1位数或最多3位数,所以我一直在努力找出最好的正则表达式,以正确的格式将其分解。

有人有什么想法吗?

更新

我实际使用它的代码,我今天提取了mlb游戏的xml,只过滤出标记为Final的游戏,意思是Final Score,然后我试图从那里进一步分解它。。

<?php


$xml = simplexml_load_file("http://feeds.feedburner.com/mpiii/mlb?format=xml");

  foreach($xml->channel->item as $item){
  if(preg_match('/(FINAL)/', $item->title, $matches) || preg_match('/(POSTPONED)/',   $item->title, $matches)){
if(preg_match('/(POSTPONED)/', $item->title, $matches)){
    continue;
}
$string = $item->title;
$patterns = array();
$patterns[0] = '/''(FINAL'')/';
$patterns[1] = '/''(POSTPONED'')/';
$replacements = array();
$replacements[1] = '';
$replacements[0] = '';
$string = preg_replace($patterns, $replacements, $string);

 $keywords = preg_match("^(.*?) ([0-9]{1,3}) (.*?) ([0-9]{1,3})$", $string);
 echo $keywords[1]."<br/>";
 }
 }



?>

您可以根据数字序列拆分字符串,假设团队名称也不包含数字:(

$s = 'San Diego 4 Chicago Cubs 2';
list($home_team, $home_score, $away_team, $away_score) = array_filter(
  array_map('trim', 
    preg_split('/'b('d+)'b/', $s, -1, PREG_SPLIT_DELIM_CAPTURE)
  ), 'strlen');
$arr = array("San Diego 4 Chicago Cubs 2",
    "Miami 2 Philadelphia 7",
    "Boston 3 Toronto 1",
    "Washington 3 Atlanta 1",
    "Chicago Sox 3 Texas 1",
    "St. Louis 6 Milwaukee 5"
);
$results = array();
foreach ($arr as $v) {
    $scores = preg_split("/[A-Za-z's'.]+/", $v);
    $teams = preg_split("/['d]+/", $v);
    $results[] = "Home: ".$teams[0]." (".$scores[1]."), Away: ".$teams[1]." (".$scores[2].")"; }
foreach ($results as $v) {
    echo $v."<br>"; }

结果:

主场:圣地亚哥(4(,客场:芝加哥小熊队(2(

主场:迈阿密(2(,客场:费城(7(

主场:波士顿(3(,客场:多伦多(1(

主场:华盛顿(3(,客场:亚特兰大(1(

主场:芝加哥袜队(3(,客场:德克萨斯队(1(

主场:圣路易斯(6(,客场:密尔沃基(5(


很明显,你可以随心所欲地构建$results;但解决方案的核心是正则表达式:

$scores = preg_split("/[A-Za-z's'.]+/", $v);
$teams = preg_split("/['d]+/", $v);

也许

<?php 
$rssLine="San Diego 4 Chicago Cubs 2";
//add code to loop though lines
if(preg_match ("/^(.*?) ([0-9]{1,3}) (.*?) ([0-9]{1,3})$/" ,$rssLine, $matches) ===1){
$home_team      = $matches[1];
$home_score     = $matches[2];
$away_team      = $matches[3];
$away_score     = $matches[4];
}
else{
//log no match found
}
?>

第一场比赛是主队。第二场比赛是主场比分。第三场比赛是客场比赛。第四场比赛客场得分

这可能正是您想要的:

<?php 
$your_input_string ="San Diego 4 Chicago Cubs 2 Miami 2 Philadelphia 7 Boston 3 Toronto 1 Washington 3 Atlanta 1 Chicago Sox 3 Texas 1 St. Louis 6 Milwaukee 5 ";
$your_result = array_chunk(array_filter( array_map('trim', preg_split('/'b('d+)'b/', $your_input_string, -1, PREG_SPLIT_DELIM_CAPTURE)), 'strlen'),4);
echo '<pre>';
print_r($your_result);
 ?>

现场演示>>