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's answer is best considering you need to be able to handle newlines on different machines.
"I'm mostly looking for useful PHP functions, not an algorithm for how to do it. Any suggestions?"
I use these a lot:
- explode() can be used to split a string into an array, given a single delimiter.
- implode() is explode's counterpart, to go from array back to string.
참고URL : https://stackoverflow.com/questions/1462720/iterate-over-each-line-in-a-string-in-php
'programing tip' 카테고리의 다른 글
android : DrawableRight를 사용하여 버튼 및 TextViews에서 VectorDrawable을 사용할 수 있습니까? (0) | 2020.07.22 |
---|---|
중요한 스타일 재정의 (0) | 2020.07.22 |
Ruby에서 매우 저렴한 명령 줄 옵션 구문 분석 (0) | 2020.07.22 |
하위 도메인과 함께 postman을 사용할 때 "응답을 얻을 수 없습니다"응답 (0) | 2020.07.22 |
Brew 설치 도커에 도커 엔진이 포함되어 있지 않습니까? (0) | 2020.07.22 |