[php] PHP에서 문자열의 각 줄을 반복

사용자가 텍스트 파일을 업로드하거나 파일 내용을 텍스트 영역에 복사 / 붙여 넣을 수있는 양식이 있습니다. 두 가지를 쉽게 구별하고 문자열 변수에 입력 한 것을 넣을 수는 있지만 어디로 가야합니까?

문자열의 각 줄을 반복하고 (바람직하게는 다른 컴퓨터의 줄 바꿈에 대해 걱정하지 않아야 함) 정확히 하나의 토큰 (공백, 탭, 쉼표 등 없음)이 있는지 확인하고 데이터를 삭제 한 다음 SQL 쿼리를 생성해야합니다 모든 라인을 기반으로합니다.

나는 꽤 좋은 프로그래머이므로 그것을하는 방법에 대한 일반적인 아이디어를 알고 있지만 PHP로 작업한지 너무 오래되어 잘못된 것을 찾고 있다고 생각하여 쓸모없는 정보가 떠 오릅니다. 내가 가지고있는 주요 문제는 문자열의 내용을 한 줄씩 읽고 싶다는 것입니다. 파일이라면 쉬울 것입니다.

나는 주로 유용한 PHP 함수를 찾고 있는데, 그 방법에 대한 알고리즘이 아닙니다. 어떤 제안?



답변

preg_split 텍스트가 포함 된 변수를 반환하고 반환 된 배열을 반복합니다.

foreach(preg_split("/((\r?\n)|(\r\n?))/", $subject) as $line){
    // do stuff with $line
} 


답변

내가 제안하고 싶은 크게 : 빠른 (메모리 효율) 대안 strtok보다는 preg_split.

$separator = "\r\n";
$line = strtok($subject, $separator);

while ($line !== false) {
    # do something with $line
    $line = strtok( $separator );
}

성능을 테스트하면서 17,000 줄의 테스트 파일을 100 번 반복 preg_split했습니다 .27.7 초가 걸렸습니다 .strtok 1.4 초가 걸렸습니다.

참고있는이 비록 $separator같이 정의된다 "\r\n",strtok 그리고 PHP4.1.0의 비어 선 / 토큰을 건너 – 중 캐릭터에 분리됩니다.

strtok 매뉴얼 항목을 참조하십시오 :
http://php.net/strtok


답변

다른 시스템에서 줄 바꿈을 처리 해야하는 경우 단순히 PHP 사전 정의 상수 PHP_EOL (http://php.net/manual/en/reserved.constants.php)을 사용하고 정규 표현식 엔진의 오버 헤드를 피하기 위해 explode를 사용하면됩니다 .

$lines = explode(PHP_EOL, $subject);


답변

지나치게 복잡하고 추악하지만 제 생각에는 이것이 갈 길입니다.

$fp = fopen("php://memory", 'r+');
fputs($fp, $data);
rewind($fp);
while($line = fgets($fp)){
  // deal with $line
}
fclose($fp);


답변

foreach(preg_split('~[\r\n]+~', $text) as $line){
    if(empty($line) or ctype_space($line)) continue; // skip only spaces
    // if(!strlen($line = trim($line))) continue; // or trim by force and skip empty
    // $line is trimmed and nice here so use it
}

^ 이것은 라인을 올바르게 나누는 방법 이며, 크로스 플랫폼과 호환됩니다 Regexp🙂


답변

잠재적 메모리 문제 strtok:

제안 된 솔루션 중 하나 strtok가을 사용하기 때문에 불행히도 잠재적 인 메모리 문제를 지적하지는 않습니다 (메모리 효율적이라고 주장하지만). 매뉴얼strtok 에 따라 사용 하는 경우 :

strtok에 대한 첫 번째 호출 만 문자열 인수를 사용합니다. strtok에 대한 모든 후속 호출 은 현재 문자열의 위치를 ​​추적하므로 사용할 토큰 만 있으면됩니다 .

파일을 메모리에로드하여이를 수행합니다. 큰 파일을 사용하는 경우 파일을 반복하면 파일을 플러시해야합니다.

<?php
function process($str) {
    $line = strtok($str, PHP_EOL);

    /*do something with the first line here...*/

    while ($line !== FALSE) {
        // get the next line
        $line = strtok(PHP_EOL);

        /*do something with the rest of the lines here...*/

    }
    //the bit that frees up memory
    strtok('', '');
}

실제 파일에만 관심이있는 경우 (예 : 데이터 마이닝) :

manual에 따르면 파일 업로드 부분에 대해 다음 file명령을 사용할 수 있습니다 .

 //Create the array
 $lines = file( $some_file );

 foreach ( $lines as $line ) {
   //do something here.
 }


답변

Kyril의 대답은 다른 컴퓨터에서 줄 바꿈을 처리해야한다는 점을 고려하는 것이 가장 좋습니다.

“저는 유용한 PHP 함수를 찾고 있는데, 그 방법에 대한 알고리즘이 아닙니다. 어떤 제안이 있습니까?”

나는 이것을 많이 사용합니다 :

  • 터지다() 를 사용하면 단일 구분 기호를 사용하여 문자열을 배열로 분할 할 수 있습니다.
  • implode ()는 폭발에서 대응하는 배열로 배열에서 문자열로 돌아갑니다.