내가 이거 가지고있어:
$text = '
hello world
hello
';
자체 회선에있는 경우
에만 제거하려면 어떻게합니까 ? 위의 예에서 두 번째
는 제거해야합니다. 결과는 다음과 같아야합니다.
$text = '
hello world
hello
';
내가 지금까지 시도한 것
를 통해 다음을 수행 str_replace()
할 수 있습니다.
$text = str_replace(' ', '', $text);
그러나 그것은 자체 라인에있을 때뿐만 아니라 의 모든 인스턴스를 제거 합니다
.
답변
나는 이미이 접근법을 시도했지만 원하는 결과를 얻습니다.
// Your initial text
$text = '
hello world
hello
';
// Explode the text on each new line and get an array with all lines of the text
$lines = explode("\n", $text);
// Iterrate over all the available lines
foreach($lines as $idx => $line) {
// Here you are free to do any if statement you want, that helps to filter
// your text.
// Make sure that the text doesn't have any spaces before or after and
// check if the text in the given line is exactly the same is the
if ( ' ' === trim($line) ) {
// If the text in the given line is then replace this line
// with and emty character
$lines[$idx] = str_replace(' ', '', $lines[$idx]);
}
}
// Finally implode all the lines in a new text seperated by new lines.
echo implode("\n", $lines);
내 로컬 출력은 다음과 같습니다.
hello world
hello
답변
내 접근 방식은 다음과 같습니다.
- 줄 바꿈에서 텍스트 분해
- 배열의 각 값 자르기
- 값으로 각 배열 항목 비우기
- 새로운 라인으로 임 플라이드
결과는 다음과 같습니다.
$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, ' ') as $key) {
$chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);
답변
아마도 이런 식으로 뭔가 :
$text = preg_replace("~(^[\s]?|[\n\r][\s]?)( )([\s]?[\n\r|$])~s","$1$3",$text);
http://sandbox.onlinephpfunctions.com/code/f4192b95e0e41833b09598b6ec1258dca93c7f06
( PHP5 에서는 작동 하지만 일부 버전의 PHP7 에서는 작동하지 않습니다 )
대안은 다음과 같습니다.
<?php
$lines = explode("\n",$text);
foreach($lines as $n => $l)
if(trim($l) == ' ')
$lines[$n] = str_replace(' ','',$l);
$text = implode("\n",$lines);
?>
답변
줄 끝 문자를 알고 있고
항상 새 줄이 오는 경우 :
<?php
$text = '
hello world
hello
';
print str_replace(" \n", "\n", $text);
출력 (여기서 서식에서 일부 초기 공백이 손실 됨) :
hello world
hello
주의 사항 :
다른 내용 앞에 있는 로 끝나는 행도 영향을 받으므로 사용자 요구에 맞지 않을 수 있습니다.
답변
DOTALL 및 MULTILINE 수정자를 look-around 어설 션과 함께 사용하여 정규 표현식을 사용할 수 있습니다.
preg_replace("~(?sm)(?<=\n)\s* (?=\n)~", '',$text);
(?sm)
: DOTALL (s) 멀티 라인 (m)(?<=\n)
: 줄 바꿈 앞 (경기의 일부가 아님)\s* \s*
: 싱글 & nbsp; 선택적인 주변 공백(?=\n)
: 후행 줄 바꿈 (일치 항목이 아님)
>>> $text = '
hello world
hello
';
=> """
\n
hello world\n
\n
hello\n
"""
>>> preg_replace("~(?sm)(?<=\n)\s* \s*(?=\n)~", '',$text);
=> """
\n
hello world\n
\n
hello\n
"""
>>>
답변
행으로 분할 한 다음 공백
만 포함 된 행에서 빈 문자열 을 대체 할 수 있습니다
.
우리는 캡처하여 원래 줄 끝을 유지합니다.
<?php
$text = '
hello world
hello
';
$lines = preg_split('@(\R)@', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach($lines as &$v)
if (trim($v) === ' ')
$v = str_replace(' ', '', $v);
$result = implode($lines);
var_dump($result);
산출:
string(40) "
hello world
hello
"