2014-12-24 1 views
0

것은 내가 PHP에서 작업이처럼 보이는 문자열을 구문 분석 할 필요 해요 :순수 정규식과 일치하는 항목 모두를 찾으시겠습니까?

Rake (100) Pot (1000) Players (andy: 10, bob: 20, cindy: 70) 

내가 이름을 가진 선수 당 레이크, 냄비, 그리고 레이크 공헌을 얻을 필요가있다. 선수의 수는 가변적입니다. 플레이어 이름과 레이크 기여도를 일관된 방식으로 일치시킬 수있는 한 명령은 부적합합니다.

예를 들어 나는 이런 식으로 뭔가를 얻기 위해 찾고 있어요 :

Array 
(
    [0] => Rake (100) Pot (1000) Players (andy: 10, bob: 20, cindy: 70) 
    [1] => 100 
    [2] => 1000 
    [3] => andy 
    [4] => 10 
    [5] => bob 
    [6] => 20 
    [7] => cindy 
    [8] => 70 
) 

나는 문자열과 일치하는 정규 표현식을 마련 할 수 있었다 그러나 마지막 플레이어 레이크 기여 쌍을 반환

^Rake \(([0-9]+)\) Pot \(([0-9]+)\) Players \((?:([a-z]*): ([0-9]*)(?:,)?)*\)$ 

출력 :

Array 
(
    [0] => Rake (100) Pot (1000) Players (andy: 10, bob: 20, cindy: 70) 
    [1] => 100 
    [2] => 1000 
    [3] => cindy 
    [4] => 70 
) 

난으로, preg_match_all와 g 수정을 사용하여 시도했다 그러나 성공하지 못했습니다. preg_match_all은 player-rake 기여도 쌍만 원한다면 원했던 것을 얻을 수 있지만, 필자가 요구하기도 전에 데이터가 있습니다.

분명히 폭발을 사용하여 데이터를 직접 파싱 할 수 있지만 그 경로를 내려 가기 전에 순수 정규식으로 수행 할 수 있는지 여부를 알아야합니다. 당신은 아래의 정규식을 사용할 수

+0

무엇 당신의 예상되는 출력? –

+1

"예를 들면 다음과 같은 것을 얻으려고합니다 :" – Abovestand

+2

'preg_match_all' 또는'g'를 반복해서 사용하지 않기 때문에'() *'캡처 그룹은'cindy'가 마지막으로 저장된 것을 저장합니다' 70' 예상대로 – nu11p01n73R

답변

1

, 최초의 비 캡처 그룹의 마지막에서

(?:^Rake \(([0-9]+)\) Pot \(([0-9]+)\) Players \(|)(\w+):?\s*(\d+)(?=[^()]*\)) 

DEMO

|는 패턴을 사용하여 나머지 문자열에서 문자와 일치하는 정규 표현식 엔진을하는 데 도움이 비 포획 그룹을 따른다. 그냥 선수를 분할 마지막 캡처 그룹에 explode() 기능을 사용하여 다음

^Rake \((?<Rake>\d+)\) Pot \((?<Pot>\d+)\) Players \(((?:\w*: \d*(?:,)?)+)\)$ 

그리고 :

1

내가 입력 문자열을 검증하기 위해 다음과 같은 정규식을 사용

preg_match($regex, $string, $matches); 
$players = explode(', ', $matches[2]); 
관련 문제