2013-10-02 3 views
1

나는 서버로부터 거대한 문자열을 가지고 있으며, 각 라인을 객체로 (나중에 foreach 루프를 위해) 원한다.큰 문자열을 객체로 자르기

이는 문자열의 일부입니다

1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;; 
1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; 
1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; 
1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;; 

각 행에 대해 동일하게 유지하는 유일한 것은이 "닫는 태그"
단지 두 가지 옵션이 있습니다 :

  1. ;; 폐쇄; ;;;닫은;;
  2. ;; 열기 ;;; 열기 ;;

    element[0] 1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;; 
    element[1] 1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; 
    element[2] 1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; 
    element[3] 1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;;  
    

    문자열은 "선"에서 제공되지 않습니다 :

나는

는 최종 출력해야 ... 폭발 또는 일부 정규식의 바늘이되어야한다고 생각했다 그것은 하나의 커다란 선입니다.

+0

각 줄을 배열 요소로 사용합니까? –

+0

서버에서 오는 각 줄 뒤에 캐리지 리턴이 있습니까? – user2793390

+0

예, 죄송합니다, PHP에 새로 왔습니다 ... – user2706762

답변

1

preg_match_all function :

을 사용할 수 있습니다.
$s = <<< EOF 
1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;; 
1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; 
1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; 
1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;; 
EOF; 

if (preg_match_all('~(.*?;;(open|closed);{4}\2;;)~', $s, $arr)) 
    print_r($arr[1]); 

출력 :

Array 
(
    [0] => 1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;; 
    [1] => 1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; 
    [2] => 1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; 
    [3] => 1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;; 
) 
+0

고마워요.하지만 문자열에 줄이 생기지 않는 것은 큰 줄입니다. – user2706762

+0

ok 지금 편집을 확인하십시오. – anubhava

+0

null : (하지만 감사합니다. – user2706762

1

split을 참조하십시오. split("\n", $string)은 배열을 제공하며 각 항목은 문자열의 한 줄입니다.

1

이에 대한 file()을 사용할 수 있습니다 : - :

-

$lines = file('path/to/file'); 
foreach($lines as $line){ 
    //do something with $line 
} 

$를 선

var_dump($lines); 

같은 것을 줄 것이다 그래야 파일의 라인을 대표하는 각 요소 배열입니다

array (size=4) 
    0 => string '1535;;34290;;teaserbanner_881.jpg;;Not allowed;;closed;;;;closed;;' (length=68) 
    1 => string '1535;;34291;;teaserbanner_8832.jpg;;Not allowed;;closed;;;;closed;; ' (length=69) 
    2 => string '1379;;31912;;teaserbanner_844.jpg;;Allowed;;open;;;;open;; ' (length=60) 
    3 => string '1379;;31913;;teaserbanner_8422.jpg;;allowed;;closed;;;;closed;;' length=63) 
+0

고마워요.하지만 문자열에 줄이 생기지 않는 것은 큰 줄입니다. – user2706762

+0

아, 네, 그건 당신이 당신의 질문에 보여준 것이 아닙니다. 그렇다면 어떻게 분할 할 것인가를 어떻게 결정합니까? – vascowhite

+0

;; 폐쇄 ;;; 폐쇄; 또는 ;; 열기 ;;; 열기 ;; – user2706762

0

큰 의미를 무엇?

exploding() 실제로 엄청난 것이 PHP 메모리를 고갈시킵니다.

이전 학교 char를 char로 구문 분석하고 양동이에 추가해야합니다. 귀하의 조건이 (예 : ; 또는 10th ; 또는 기타 ...)과 같을 때 버킷에 적절한 객체를 고려하여 처리하십시오. 그러나 그것을 저장하지 마십시오. 파일, DB 등으로 푸시합니다.

일 그 거대한을하지 않은 경우, '객체' 형식으로 regular expression를 사용합니다. 좋아요 :

// keep duplicating the (.*?);; until you reach your number of columns. 
preg_match_all '~(.*?);;(.*?);;(.*?);;(.*?);;(.*?);;~s' // pseudo-code :) 

그리고이 모든 것이 개체와 속성으로 나뉩니다. 반복하고 사용할 수있는 항목.preg_split를 사용

1

시도 :

$array = preg_split('/(?<=;;closed;;;;closed;;|;;open;;;;open;;)(?!$)/', $string) 

(?<=;;closed;;;;closed;;|;;open;;;;open;;)이 닫는 태그 분할 지점 전에하고 (?!$) 문자열이 마지막에 분할되지 않았는지 확인합니다 확인합니다.

viper7 demo