2013-05-10 2 views
1

다음과 같은 문자열이 있습니다 (예제의 문자는 숫자 또는 텍스트 일 ​​수 있으며 대문자 또는 소문자 또는 둘 모두 일 수 있음) 값이 문장 인 경우 작은 따옴표 사이 여야합니다) :정규식을 사용하여 문자열 파열

다음과 같은 결과를 얻으려면 어떻게해야합니까?

Array([0]=>"a",[1]=>"b",[2]=>"c",[3]=>"(d,e,f)",[4]=>"g",[5]=>"'h,i j'",[6]=>"k") 

정규 표현식을 사용하면 빠르고 깨끗한 해결책이 될 것입니다. 어떤 생각?

편집 :

$separator="*"; // whatever which is not used in the string 
$Pattern="'[^,]([^']+),([^']+)[^,]'"; 
while(ereg($Pattern,$String,$Regs)){ 
    $String=ereg_replace($Pattern,"'\\1$separator\\2'",$String); 
} 

$Pattern="\(([^(^']+),([^)^']+)\)"; 
while(ereg($Pattern,$String,$Regs)){ 
    $String=ereg_replace($Pattern,"(\\1$separator\\2)",$String); 
} 

return $String; 

이, 괄호 사이의 모든 쉼표를 대체합니다 : 이 내가 괄호 사이의 긴 부분을 갖는 문자열에 대한 매우 느린이다, 지금까지 한 일이다. 그런 다음 나는 쉼표로 그것을 폭발시킬 수 있으며 $separator을 원래의 쉼표로 대체하십시오.

+0

당신은() 함수를 폭발 시도? ref - http://php.net/manual/en/function.explode.php –

+0

그리고 지금까지 어떤 시도를 했습니까? 실제 문제는 무엇입니까 (다른 사람이 당신을 위해 그것을하기를 원합니다). –

+0

입력 문자열이 어떻게 표시되는지 자세히 설명하십시오. 그것은 항상 단지''와''''소문자가 항상 소문자이고 그 중 하나만 필요합니까? – dognose

답변

4

당신은으로, preg_match_all 사용하여 일을 할 수

$string="a,b,c,(d,e,f),g,'h, i j.',k"; 

preg_match_all('~\'[^\']++\'|\([^)]++\)|[^,]++~', $string,$result); 
print_r($result[0]); 

설명 :

비결은 하나 개 이상의 구분 기호 등이있는 경우,

~   Pattern delimiter 
' 
[^']  All charaters but not a single quote 
++   one or more time in [possessive][1] mode 
' 
|   or 
\([^)]++\) the same with parenthesis 
|   or 
[^,]  All characters but not a comma 
++ 
~ 

전에 괄호 일치하는 것입니다 따옴표 (열기 및 닫기에 대해 동일)를 사용하면 캡처 gro를 사용하여 다음과 같이 패턴을 작성할 수 있습니다 최대 :

$string="a,b,c,(d,e,f),g,'h, i j.',k,°l,m°,#o,p#,@q,[email protected],s"; 

preg_match_all('~([\'#@°]).*?\1|\([^)]++\)|[^,]++~', $string,$result); 
print_r($result[0]); 

설명 : 중첩 된 괄호와

(['#@°]) one character in the class is captured in group 1 
.*?  any character zero or more time in lazy mode 
\1   group 1 content 

:

$string="a,b,(c,(d,(e),f),t),g,'h, i j.',k,°l,m°,#o,p#,@q,[email protected],s"; 

preg_match_all('~([\'#@°]).*?\1|(\((?>[^()]++|(?-1)?)*\))|[^,]++~', $string,$result); 
print_r($result[0]); 
+0

감사합니다. 나는 이것을 시도하고 그것이 실제 상황에서 어떻게 작동하는지 알려주지. 한 가지만 더 추가했습니다. 귀하의 솔루션에 어떤 영향을 미칠지 모르는 경우 – SAVAFA

+0

@SaVaFa : 작은 따옴표로 동일한 작업을 수행 할 수 있습니다. –

+0

@CasimiretHippolyte : 괜찮습니다. 해결책이라고 생각합니다. (, (,),)와 같은 중첩 된 괄호에 문제가 있음을 주목하십시오. 그러나 주어진 질문에 대해 작동합니다. +1 –

관련 문제