2011-03-07 1 views
0

Je développe un forum de jeu de style rugby et je cherche de l'aide pour développer un analyseur regx pour analyser les jeux de jeux.Aide PHP Regex - analyse des ensembles de données basés sur le format

Chaque poste pourrait avoir le possible sous formats (différence est que certaines personnes peuvent utiliser une virgule pour briser jeux et aussi certains peuvent hypernate le score - ou tout combinatio des deux):

teamA 25- 31 TeamB TEAMC 28-35 TEAMD Teame 38-10 TEAMF TEAMG 21-15 TEAMH

.

Teama 25 31 TeamB TEAMC 28 35 TEAMD Teame 38 10 TEAMF TEAMG 21 15 TEAMH

.

teamA 25-31 TeamB, TEAMC 28-35 TEAMD, Teame 38-10 TEAMF, TEAMG 21-15 TEAMH

.

teamA 25 31 TeamB, TEAMC 28 35 TEAMD, Teame 38 10 TEAMF, TEAMG 21 15 TEAMH

Fondamentalement, les équipes sont toujours censés être 5 caractères et le score assis dans entre les deux équipes mais il n'y a pas forcément toujours le même nombre de parties dans un post individuel, c'est-à-dire qu'un poste pourrait être un jeu ou 20. Il pourrait aussi y avoir du texte supplémentaire avant ou après mais il doit encore être capable de Jeux. Juste besoin que chaque partie soit séparée, c'est-à-dire que [TEAMA] [SCORE] [SCORE] [TEAMB] serait considéré comme un jeu.

J'ai commencé à utiliser exploser mais je n'ai pas eu beaucoup de chance et malheureusement je n'ai pas beaucoup d'expérience regx donc je cherche un moyen flexible d'accommoder ce qui précède - j'ai juste besoin de séparer chaque partie.

Toute aide appréciée.

Répondre

3

Il est plus facile de faire correspondre chaque résultat que de les diviser, par ex.:

preg_match_all('/(?P<teamA>\w{5})\s+(?P<scoreA>\d+)[\s-](?P<scoreB>\d+)\s+(?P<teamB>\w{5})/', $str, $m, PREG_SET_ORDER); 
print_r($m); 

Vous donne pour chaque résultat, quelque chose comme:

[0] => Array 
    (
     [0] => TEAMA 25 31 TEAMB 
     [teamA] => TEAMA 
     [1] => TEAMA 
     [scoreA] => 25 
     [2] => 25 
     [scoreB] => 31 
     [3] => 31 
     [teamB] => TEAMB 
     [4] => TEAMB 
    ) 
0

Vous pouvez essayer une expression régulière comme celui-ci (suppose des noms d'équipe sont alphanumériques)

([a-zA-Z0-9]{5})\s+(\d+)[\s-](\d+)\s+([a-zA-Z0-9]{5}) 

http://rubular.com/r/v4HGNzo3UY

0

une alternative,

$raw_str = "TEAMA 25-31 TEAMB TEAMC 28-35 TEAMD TEAME 38-10 TEAMF TEAMG 21-15 TEAMH"; 
preg_match_all('/(?<first_team_name>[A-Z]+)\s+(?<first_team_score>[0-9]+)-(?<second_team_score>[0-9]+)\s+(?<second_team_name>[A-Z]+)/i',$raw_str,$matches); 
$scores = array(); 
foreach($matches[0] as $index => $match) 
{ 
    $scores[] = array(
        'first_team_name' => $matches['first_team_name'][$index], 
        'first_team_score' => $matches['first_team_score'][$index], 
        'second_team_name' => $matches['second_team_name'][$index], 
        'second_team_score' => $matches['second_team_score'][$index] 
        ); 
} 

print_r($scores); 

sortie:

Tableau ( [0] => Tableau ( [FIRST_TEAM_NAME] => Teama [first_team_score] => 25 [SECOND_TEAM_NAME] => TeamB [second_team_score] => 31 )

[1] => Array 
    (
     [first_team_name] => TEAMC 
     [first_team_score] => 28 
     [second_team_name] => TEAMD 
     [second_team_score] => 35 
    ) 

[2] => Array 
    (
     [first_team_name] => TEAME 
     [first_team_score] => 38 
     [second_team_name] => TEAMF 
     [second_team_score] => 10 
    ) 

[3] => Array 
    (
     [first_team_name] => TEAMG 
     [first_team_score] => 21 
     [second_team_name] => TEAMH 
     [second_team_score] => 15 
    ) 

)

0

Le regex est: [A-Z]{5}\s\d+[\s\-]\d+\s[A-Z]{5}

Voici un exemple concret de l'utilisation en Perl:

my $content = "TEAMA 25-31 TEAMB TEAMC 28 35 TEAMD TEAME 38-10 TEAMF TEAMG 21-15 TEAMH"; 
my (@scores) = $content =~ m![A-Z]{5}\s\d+[\s\-]\d+\s[A-Z]{5}!g; 

foreach my $score (@scores) { 
    print "$score\n"; 
} 

La sortie est:

teamA 25-31 TeamB

TEAMC 28 35 TEAMD

TEAM 38-10 TE Autorité des marchés financiers

TEAMG 21-15 TEAMH

Si vous aimez anycase de nom de l'équipe, vous pouvez utiliser [A-Za-z] INSEAD de [A-Z]