2

スポーツのスコアで 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 は基本的に 1 つの流れるような文字列を提供San Diego 4 Chicago Cubs 2し、より適切に使用するためにそれを分解しようとしています。

基本的に、最初に、 、、 の4San Diego 4 Chicago Cubs 2つの変数に分割しようとしています。$home_team$home_score$away_team$away_score

しかし、明らかに、ホーム チームは 1 語以上である可能性があり、スコアは 1 桁または最大 3 である可能性があるため、これを正しい形式で分割するための最適な正規表現を見つけようとしています。

誰にもアイデアはありますか?

アップデート

私が実際にこれを使用しているコードは、今日、mlb ゲームの xml を取得し、Final というラベルが付けられたゲームだけを除外して、Final スコアを意味し、そこからさらに分解しようとしています..

<?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/>";
 }
 }







?>
4

4 に答える 4

1

チーム名にも数字が含まれていないと仮定すると、一連の数字に基づいて文字列を分割できます:)

$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');
于 2013-05-03T06:35:43.543 に答える
0
$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);
于 2013-05-03T06:34:12.897 に答える
0

多分

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

?>

1試合目はホームチーム。2試合目はホームスコア。マッチ3はアウェーチーム。マッチ4はアウェイスコア

于 2013-05-03T06:29:12.550 に答える
0

これはまさにあなたが望むものかもしれません:

<?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);
 ?>

ライブデモはこちら>>

于 2013-05-03T06:24:27.393 に答える