2012-09-24 3 views
2

preg_split 메소드를 사용하면 문제가 발생합니다. 쉼표로 구분하고 싶지만 쉼표가 () 사이에없는 경우에만입니다. 예를 들어(와) 사이에 쉼표로 구분하지 않음

:

id,user(id,firstname),image(id) 

은 반환해야합니다 :

0 => id 
1 => user(id,firstname) 
2 => image(id) 
+0

인클로저가 있어야하며 데이터의 출처는 무엇입니까? 추측에 나쁜 CSV 형식 –

+4

당신은 분할하지 말고'_match'를해야합니다. – mario

+1

[PHP로 복잡한 문자열을 쉼표로 분해] (http://stackoverflow.com/questions/11062241/explode-complex-string-by-commas-in-php) (처음으로 Google 링크를 선택했습니다. 다른 사람 ...) – mario

답변

0

나는 preg_splitPREG_SPLIT_DELIM_CAPTURE으로 사용하여이 문제를 해결했습니다.

$tokens = preg_split('#(\,|\(|\))#', 'id,user(id,firstname),image(id)', PREG_SPLIT_DELIM_CAPTURE); 

결과 :

["id", ",", "user", "(", "id", "firstname", ")", "image", "(", "id", ")"] 

그 후에는 간단한 스위치 케이스와 그 배열을 구문 분석 할 수 있습니다.

0

당신은 정규식이 아닌 파서 생성기를 시도 할 수 있습니다. PHP의 대안에 익숙하지 않지만 this answer은 몇 가지 대안을 나타냅니다.

0

대신 파서를 찾으려하지만, 정규식을 사용하여 수행 할 수 있습니다.

다음과 같은 정규 표현식을 사용하여 여기 /\G(?> *)(?|([^,]*\((?>\\.|[^()])+\)[^,]*)|(?![()])([^,]+?)) *(?:,|$)/g

자세한 내용 : http://regex101.com/r/nA7dW5

행운

-1

정규식은 /(\([^()]+\))|([^,]+)/ 괄호 밖의 쉼표를 제외하고, 모든 일치하는 것이다. 도움이됩니까?

+0

당신은 내 정규식을 여기에서 테스트 할 수있다 : http://regexpal.com/ :) –

+1

아니, 그게 자바 스크립트에 대한 주어진. PHP가 아닙니다. 그것은 정규 표현식의 다른 풍미입니다. 모든 것이 동일하지는 않습니다. 대신 http://www.spaweditor.com/scripts/regex/index.php를 사용하십시오. – Daedalus

+0

그리고 위의 정규식은 OP의 요구 사항을 충족시키지 못합니다. – Daedalus

2

빠른 읽을 수있는 솔루션이 될 수 있습니다

<?php 
function parse($str) { 
    $str = preg_replace('~(\(.*?),(.*?\))~', '$1_#_PLACEHOLDER_#_$2', $str); 

    $items = array(); 
    foreach (explode(',', $str) as $item) { 
     $items[] = str_replace('_#_PLACEHOLDER_#_', ',', $item); 
    }; 
    return $items; 
} 

var_dump(parse('id,user(id,firstname),image(id)')); 

그것은 확실히 하나의 정규식 함께 할 수 있지만, 가독성이 심각하게 해칠 것입니다.

+0

좋은 아이디어. Mikulas ;-) – MrBoolean

관련 문제