preg_split 메소드를 사용하면 문제가 발생합니다. 쉼표로 구분하고 싶지만 쉼표가 ( 및 ) 사이에없는 경우에만입니다. 예를 들어(와) 사이에 쉼표로 구분하지 않음
:
id,user(id,firstname),image(id)
은 반환해야합니다 :
0 => id
1 => user(id,firstname)
2 => image(id)
preg_split 메소드를 사용하면 문제가 발생합니다. 쉼표로 구분하고 싶지만 쉼표가 ( 및 ) 사이에없는 경우에만입니다. 예를 들어(와) 사이에 쉼표로 구분하지 않음
:
id,user(id,firstname),image(id)
은 반환해야합니다 :
0 => id
1 => user(id,firstname)
2 => image(id)
나는 preg_split
을 PREG_SPLIT_DELIM_CAPTURE
으로 사용하여이 문제를 해결했습니다.
$tokens = preg_split('#(\,|\(|\))#', 'id,user(id,firstname),image(id)', PREG_SPLIT_DELIM_CAPTURE);
결과 :
["id", ",", "user", "(", "id", "firstname", ")", "image", "(", "id", ")"]
그 후에는 간단한 스위치 케이스와 그 배열을 구문 분석 할 수 있습니다.
당신은 정규식이 아닌 파서 생성기를 시도 할 수 있습니다. PHP의 대안에 익숙하지 않지만 this answer은 몇 가지 대안을 나타냅니다.
대신 파서를 찾으려하지만, 정규식을 사용하여 수행 할 수 있습니다.
다음과 같은 정규 표현식을 사용하여 여기 /\G(?> *)(?|([^,]*\((?>\\.|[^()])+\)[^,]*)|(?![()])([^,]+?)) *(?:,|$)/g
자세한 내용 : http://regex101.com/r/nA7dW5
행운
정규식은 /(\([^()]+\))|([^,]+)/
괄호 밖의 쉼표를 제외하고, 모든 일치하는 것이다. 도움이됩니까?
빠른 읽을 수있는 솔루션이 될 수 있습니다
<?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)'));
그것은 확실히 하나의 정규식 함께 할 수 있지만, 가독성이 심각하게 해칠 것입니다.
좋은 아이디어. Mikulas ;-) – MrBoolean
인클로저가 있어야하며 데이터의 출처는 무엇입니까? 추측에 나쁜 CSV 형식 –
당신은 분할하지 말고'_match'를해야합니다. – mario
[PHP로 복잡한 문자열을 쉼표로 분해] (http://stackoverflow.com/questions/11062241/explode-complex-string-by-commas-in-php) (처음으로 Google 링크를 선택했습니다. 다른 사람 ...) – mario