자체 줄에있는 용어 만 제거


16

내가 이거 가지고있어:

$text = '
   hello world
    
    hello
';

자체 회선에있는 경우   에만 제거하려면 어떻게합니까 ? 위의 예에서 두 번째  는 제거해야합니다. 결과는 다음과 같아야합니다.

$text = '
   hello world

    hello
';

내가 지금까지 시도한 것

를 통해 다음을 수행 str_replace()할 수 있습니다.

$text = str_replace(' ', '', $text);

그러나 그것은 자체 라인에있을 때뿐만 아니라 의 모든 인스턴스를 제거 합니다  .


6
지금까지 시도한 것의 아름다운 추가 -이 사이트의 표준이어야합니다. +1
게리 우즈

2
@misorude 귀하의 접근 방식으로 자유롭게 답변을 게시하십시오.
Henrik Petterson

1
@OfirBaruch 나는 시도 $text = str_replace('\n'.' '.'\n', '', $text);했지만 작동하지 않았다. 참조하십시오 .
Henrik Petterson

3
@FlashThunder 왜 str_replace()내 경험을 판단 하는 대신에 답변을 게시하지 않습니까? =)
Henrik Petterson

2
@misorude 그러나 이것이 사이트 전체의 문제라고 생각되면 메타에서 커뮤니티와 논의해야 할 것입니다. 왜 여기로 밀고 있습니까?
Henrik Petterson

답변:


10

나는 이미이 접근법을 시도했지만 원하는 결과를 얻습니다.

// 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

이렇게하면 공백도 제거되며 작성자는 제거 만 원했습니다. 
Flash Thunder

@FlashThunder 출력으로 가지고있는 것이 출력과 완전히 정렬되어 질문에 의해 요청되었습니다. 내 출력이 초기 요구 사항과 동일한 지 확인하면 PHP 7에서 코드를 실행하려고 했습니까? 다른 출력이 있습니까?
Merianos Nikos

필자는 공간 뒤에 다른 주석을 요청하면서 탭 / 몇 개의 공백이 있음을 알지 못한다고 말합니다.
플래시 썬더

@FlashThunder 알고 있습니다. 나는 단지 사례를 요구하고 있었다.
Henrik Petterson

1
죄송합니다. clickclick이어야합니다.
Flash Thunder

2

내 접근 방식은 다음과 같습니다.

  1. 줄 바꿈에서 텍스트 분해
  2. 배열의 각 값 자르기
  3. 값으로 각 배열 항목 비우기  
  4. 새로운 라인으로 임 플라이드

결과는 다음과 같습니다.

$chunks = explode(PHP_EOL, $text);
$chunks = array_map('trim', $chunks);
foreach (array_keys($chunks, ' ') as $key) {
    $chunks[$key] = '';
}
$text = implode(PHP_EOL, $chunks);

2
코드의 출력은 요청 된 것과 동일하지 않습니다  . 또한, 귀하의 답변을 downvoted 한 것은 아닙니다. 내 의견은 단지 우호적 인 메시지였습니다 :)
Merianos Nikos

1
좋아요,이 문제를 해결하기 위해 답변을 업데이트했습니다
JanP

1
훨씬 더 나은 지금 :)
Merianos Nikos

2

아마도 이런 식으로 뭔가 :

$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) == '&nbsp;')
            $lines[$n] = str_replace('&nbsp;','',$l);
    $text = implode("\n",$lines);
?>

1
나는 그것을 테스트하고 작동하지 않습니다 :). 또한 나는 당신에게 downvotes를주지 않았다는 것을 명심하십시오. 그것은 친절한 의견입니다 :) 솔루션을 테스트 한 후에도 출력은 변경되지 않습니다.
Merianos Nikos

@MerianosNikos 어떻습니까? sandbox.onlinephpfunctions.com/code/…
Flash Thunder

1
그게 내가 당신의 코드를 실행하면 내 지역에서 무엇을 얻을 : pasteboard.co/IUkf2MK.png :
Merianos 니 코스

2
@MerianosNikos 아 웃기는 PHP5에서는 작동하지만 PHP7에서는 작동하지 않습니다.
Flash Thunder

당신이 옳은 것 같다. PHP 7에서 실행합니다.
Merianos Nikos 10

1

줄 끝 문자를 알고 있고 &nbsp;항상 새 줄이 오는 경우 :

<?php
$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';


print str_replace("&nbsp;\n", "\n", $text);

출력 (여기서 서식에서 일부 초기 공백이 손실 됨) :

   hello&nbsp;world

   &nbsp;hello

주의 사항 : &nbsp;다른 내용 앞에 있는 로 끝나는 행도 영향을 받으므로 사용자 요구에 맞지 않을 수 있습니다.


1
우리가 고집한다면 이것은 실제로 매우 견고한 솔루션입니다 str_replace()!
Henrik Petterson

그렇습니까? 작동하지 않을 경우 더 많은 사례를 볼 수 있습니다.
Flash Thunder

@ Progrock은 이후의 공백을 계산하는 방식으로 조정할 수 &nbsp;있습니까? 예를 들면 다음과 같습니다"&nbsp; \n"
헨릭 Petterson

@HenrikPetterson no
Flash Thunder

1

DOTALL 및 MULTILINE 수정자를 look-around 어설 션과 함께 사용하여 정규 표현식을 사용할 수 있습니다.

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) 멀티 라인 (m)
  • (?<=\n): 줄 바꿈 앞 (경기의 일부가 아님)
  • \s*&nbsp;\s*: 싱글 & nbsp; 선택적인 주변 공백
  • (?=\n): 후행 줄 바꿈 (일치 항목이 아님)
>>> $text = '                                                                                               
 hello&nbsp;world                                                                                         
 &nbsp;                                                                                                   
 &nbsp;hello                                                                                           
 ';
=> """
   \n
      hello&nbsp;world\n
      &nbsp;\n
      &nbsp;hello\n
   """
>>> preg_replace("~(?sm)(?<=\n)\s*&nbsp;\s*(?=\n)~", '',$text);
=> """
   \n
      hello&nbsp;world\n
   \n
      &nbsp;hello\n
   """
>>>

0

행으로 분할 한 다음 공백 &nbsp;만 포함 된 행에서 빈 문자열 을 대체 할 수 있습니다 &nbsp;.

우리는 캡처하여 원래 줄 끝을 유지합니다.

<?php

$text = '
   hello&nbsp;world
   &nbsp;
   &nbsp;hello
';
$lines = preg_split('@(\R)@', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach($lines as &$v)
    if (trim($v) === '&nbsp;')
        $v = str_replace('&nbsp;', '', $v);

$result = implode($lines);
var_dump($result);

산출:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.