2014-01-23 2 views
0

PHP에서 문자열을 구문 분석하고 하위 문자열을 배열에 저장하려고합니다. 다음과 같이 문자열의 형식은 다음과 같습니다정규 표현식을 사용하는 PHP의 선택적 부분 문자열

@SomeText1 ;SomeText2 $SomeText3 #SomeText4 

는 (이하 "SomeText"문자열이 @ 포함하지 않습니다, 즉 문제가되지, 그래서 $ # 문자)

내가 SomeText1, SomeText2을 추출 할

, ... PHP를 별도로 사용하지만 catch가 있습니다. ";" 선택 사항입니다. 따라서 일부 예제 문자열은 다음과 같을 수 있습니다.

@ SomeText1 ; SomeText2 
@ SomeText1 # SomeText4 
@ SomeText1 $ SomeText3 # SomeText4 

나는이 작업을 완전히 수행하지 못했습니다.

여기에 대한 답변을 찾으려고했지만 가장 가까운 찾을 수 (Matching an optional substring in a regex) 및 (Regex to capture an optional group in the middle of a block of input), 내 사례에 적용 할 때 실패했습니다.

대단히 감사합니다.

'/@ *(\w+)(?: *; *(\w+))?/' 

을 그리고 당신이 문자열 (일치하는 그룹)에 대한 matches[1] and matches[2]을 찾습니다

+1

'$ 배열 = preg_split를 ('/ \ *이 s의 [; $ #] \의 * /', $ 텍스트); 거기에'@'를 추가하고 원한다면 첫 번째 요소를 무시하십시오. @ Qtax 완료. – Qtax

+0

. 답변으로 제출해 주시면 기꺼이 수락하겠습니다. – user3208442

답변

0

한 가지 방법은 preg_split을 사용하는 것입니다

$array = preg_split('/\s*[;$#]\s*/', $text); 

또한 거기에 @을 추가하고 당신이 그것을 제거 할 경우 첫 번째 요소를 무시할 수 있습니다 :

$array = preg_split('/\s*[@;$#]\s*/', $text); 
array_shift($array); 
0

당신은 preg_match 함수 호출이 정규식을 사용할 수 있습니다.

0

순서가 일치로 너무 오래, 당신은이 작업을 수행 할 수 있습니다

preg_match("((@\S+)\s*(;\S+)?\s*(\$\S+)?\s*(#\S+)?)",$input,$matches); 

이제 $matches은 다음과 같습니다

$matches = array(
    "@SomeText1", 
    ";SomeText2" or null if it wasn't there, 
    "$SomeText3" or null if it wasn't there, 
    "#SomeText4" or null if it wasn't there 
); 

HTH에게

관련 문제