2012-08-02 2 views
0

나는 다음과 같은 데이터를 아래로 제거하는 정규식을 사용하려고 시도하고있다 :정규식 문 문제 - PHP

mlb_s_left1=Baltimore 3 ^NY Yankees 12 (FINAL)&mlb_s_right1_1=W: Hughes L: Britton&mlb_s_right1_count=1&mlb_s_url1=http://sports.espn.go.com/mlb/boxscore?gameId=320801110&mlb_s_left2=^Chicago Sox 3 Minnesota 2 (FINAL)&mlb_s_right2_1=W: Peavy L: Diamond S: Reed&mlb_s_right2_count=1&mlb_s_url2=http://sports.espn.go.com/mlb/boxscore?gameId=320801109 

내가 떨어져 홈 팀 (처음시), 홈 점수 (첫 번째 숫자)하여 분할 바라고을, 거리 스코어 (두 번째 도시), 거리 스코어 (두 번째 숫자), 그리고 게임에서의 위치 (괄호 안). 이것은 내가 현재 가지고있는 RegEx이지만 느낌은 매우 잘못되었습니다.

preg_match_all('/mlb_s_left[0-9]=(?P<hometeam>.*?) (?P<homescore>.*?) (?P<awayteam>.*?) (?P<awayscore>.*?)\((?P<time>.*?)\)/', $content, $matches); 

나는이 모든 작업에 도움을 주셔서 감사합니다.

답변

2

:

<?php 
$foo = 'mlb_s_left1=Baltimore 3 ^NY Yankees 12 (FINAL)&mlb_s_right1_1=W: Hughes L: Britton&mlb_s_right1_count=1&mlb_s_url1=http://sports.espn.go.com/mlb/boxscore?gameId=320801110&mlb_s_left2=^Chicago Sox 3 Minnesota 2 (FINAL)&mlb_s_right2_1=W: Peavy L: Diamond S: Reed&mlb_s_right2_count=1&mlb_s_url2=http://sports.espn.go.com/mlb/boxscore?gameId=320801109'; 
preg_match_all('/mlb_s_left\d=\^?(?P<hometeam>[a-zA-Z]+(?:\s+[a-zA-Z]+)*)\s+(?P<homescore>\d+)\s+\^?(?P<awayteam>[a-zA-Z]+(?:\s+[a-zA-Z]+)*)\s+(?P<awayscore>\d+)\s+\((?P<time>\w+)\)/', $foo, $matches, PREG_SET_ORDER); 

print_r($matches); 

?> 

출력 :

Array 
(
    [0] => Array 
     (
      [0] => mlb_s_left1=Baltimore 3 ^NY Yankees 12 (FINAL) 
      [hometeam] => Baltimore 
      [1] => Baltimore 
      [homescore] => 3 
      [2] => 3 
      [awayteam] => NY Yankees 
      [3] => NY Yankees 
      [awayscore] => 12 
      [4] => 12 
      [time] => FINAL 
      [5] => FINAL 
     ) 

    [1] => Array 
     (
      [0] => mlb_s_left2=^Chicago Sox 3 Minnesota 2 (FINAL) 
      [hometeam] => Chicago Sox 
      [1] => Chicago Sox 
      [homescore] => 3 
      [2] => 3 
      [awayteam] => Minnesota 
      [3] => Minnesota 
      [awayscore] => 2 
      [4] => 2 
      [time] => FINAL 
      [5] => FINAL 
     ) 

) 
+0

팀 이름을 일치시키기 위해'(\ w + (? : \ s + \ w +) *)'와 같은 작업을 수행 할 수도 있습니다. –

+0

@LoneShepherd : 점수와도 일치합니다 ('\ w'는 글자뿐만 아니라 숫자와도 일치합니다). 그런 다음 "점수"그룹에서 점수를 매치시켜야합니다. 그가 한 방식은 최고의 IMO입니다. –

+0

아, 좋은 지적이야. –

2

이와 비슷한 경우가 발생합니다. \d은 어떤 숫자와 일치하고, \D하지 숫자 아무것도 일치하는지

preg_match_all('/mlb_s_left\d+=(?P<hometeam>\D+)\s+(?P<homescore>\d+)\s+(?P<awayteam>\D+)\s+(?P<awayscore>\d+)\s*\((?P<time>[^)]+)\)/', 
    $content, $matches); 

참고.

[^)]+은 하나 이상의 닫을 수없는 괄호 문자와 일치합니다. \s+은 하나 이상의 공백 문자와 일치하고 \s*은 0 개 이상의 공백 문자와 일치합니다.

숫자가있는 도시 이름이 있으면 거대한 문자열이 있으면 어딘가에서 멈출 수 있습니다. 당신은 그것을 분할하고 좀 더 단편적인 것으로 생각할 것입니다.

일반적으로 거의 일치하는 패턴 일치로 .*?을 피할 것입니다. 데이터에 대해 알고있는 것을 토대로 가능한 한 구체적으로 정규식을 사용하는 것이 가장 좋습니다. 나는 PHP 5.4.5에서 코드 다음 테스트 한

+0

내가'에 대한 동의 *':.? 사람들이 너무 많이 의존하는 경향이있다. 당신이 할 수있는 한 구체적으로하는 것이 몇 가지 이점을 가지고 있습니다 : 당신은 올바른 결과를 얻을 가능성이 더 높고, 성능 문제를 일으킬 가능성이 적으며, 정규 표현식의 작동 방식에 대해 더 많이 배웁니다. –