Xóa thuật ngữ chỉ khi nó nằm trên dòng riêng của nó


16

Tôi có cái này:

$text = '
   hello world
    
    hello
';

Làm thế nào để tôi loại bỏ   chỉ khi nó là trên dòng riêng của nó? Vì vậy, với ví dụ trên, thứ hai  nên được loại bỏ. Kết quả phải là:

$text = '
   hello world

    hello
';

Những gì tôi đã cố gắng cho đến nay

Qua str_replace(), tôi có thể:

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

Nhưng điều đó sẽ loại bỏ tất cả các trường hợp  , không chỉ khi nó nằm trên dòng riêng của nó.


6
Bổ sung tuyệt vời những gì tôi đã thử cho đến nay - nên là tiêu chuẩn trên trang web này. +1
Gary Woods

2
@misorude Xin vui lòng gửi câu trả lời với cách tiếp cận của bạn.
Henrik Petterson

1
@OfirBaruch Tôi đã thử $text = str_replace('\n'.' '.'\n', '', $text);nhưng không hoạt động. Xem .
Henrik Petterson

3
@FlashThunder Tại sao bạn không đăng câu trả lời bằng cách sử dụng str_replace()thay vì đánh giá trải nghiệm của tôi. =)
Henrik Petterson

2
@misorude Nhưng đây là điều bạn sẽ cần thảo luận với cộng đồng tại meta nếu bạn cảm thấy đây là vấn đề toàn trang web. Tại sao bạn đẩy nó ở đây?
Henrik Petterson

Câu trả lời:


10

Tôi đã thử phương pháp này và tôi nhận được kết quả bạn muốn

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

Đầu ra của tôi trên địa phương của tôi là thế này:


hello world

 hello

điều này cũng sẽ xóa các khoảng trắng và tác giả chỉ muốn xóa 
Flash Thunder

@FlashThunder những gì tôi có là đầu ra hoàn toàn phù hợp với đầu ra đã được yêu cầu bởi câu hỏi. Nếu bạn kiểm tra đầu ra của tôi giống hệt với yêu cầu ban đầu :) Bạn đã thử chạy mã của tôi trong PHP 7 chưa? Bạn đã có đầu ra nào khác chưa?
Merianos Nikos

Tôi sẽ nói rằng tác giả thậm chí không biết rằng có một tab / một vài khoảng trống trong đó, vì anh ta đã hỏi trong bình luận khác về không gian sau nó (và nó không chứa điều đó).
Flash Thunder

@FlashThunder Tôi biết. Tôi chỉ yêu cầu một ví dụ trường hợp.
Henrik Petterson

1
ồ xin lỗi phải là một lỗi sai
Flash Thunder

2

Cách tiếp cận của tôi sẽ là:

  1. Phát nổ văn bản trên các dòng mới
  2. Cắt từng giá trị trong mảng
  3. Làm trống mỗi mục mảng có giá trị  
  4. Implode với các dòng mới

Kết quả trong mã sau đây:

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

2
Đầu ra của mã của bạn không giống với những gì được hỏi: / `` `hello & nbsp; world & nbsp; hello` `` Yêu cầu ban đầu là chỉ thay thế  bằng văn bản trống, không có từ xa toàn bộ dòng: /. Ngoài ra, hãy nhớ rằng không phải tôi đã hạ thấp câu trả lời của bạn :) Nhận xét của tôi chỉ là một thông điệp thân thiện :)
Merianos Nikos

1
Được rồi, tôi đã cập nhật câu trả lời của mình để sửa lỗi này
JanP

1
Cách tốt hơn nhiều bây giờ :)
Merianos Nikos

2

Có lẽ một cái gì đó như thế này:

$text = preg_replace("~(^[\s]?|[\n\r][\s]?)( )([\s]?[\n\r|$])~s","$1$3",$text);

http://sandbox.onlinephpfifts.com/code/f4192b95e0e41833b09598b6ec1258dca93c7f06

(hoạt động trên PHP5 , nhưng bằng cách nào đó không hoạt động trên một số phiên bản của PHP7 )


Thay thế sẽ là:

<?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
Tôi kiểm tra nó và không hoạt động :). Ngoài ra, hãy nhớ rằng tôi đã không cung cấp cho bạn bất kỳ downvote. Đó chỉ là một nhận xét thân thiện :) Đầu ra vẫn không thay đổi sau khi thử nghiệm giải pháp của bạn.
Merianos Nikos

@MerianosNikos sao không? sandbox.onlinephpfifts.com/code/
Flash Thunder

1
Đó là những gì tôi nhận được tại địa phương của mình khi tôi chạy mã của bạn: pasteboard.co/IUkf2MK.png :)
Merianos Nikos

2
@MerianosNikos thật buồn cười, hoạt động trên PHP5 nhưng không hoạt động trên PHP7.
Flash Thunder

Có lẽ bạn là đúng. Tôi chạy nó trên php 7.
Merianos Nikos

1

Nếu bạn biết ký tự cuối dòng của mình và dòng của bạn &nbsp;luôn được theo sau bởi một dòng mới:

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


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

Đầu ra (một số khoảng trắng nội bộ bị mất trong định dạng ở đây):

   hello&nbsp;world

   &nbsp;hello

Hãy cẩn thận: Bất kỳ dòng nào kết thúc bằng một tiền đề &nbsp;nội dung khác cũng sẽ bị ảnh hưởng, vì vậy điều này có thể không đáp ứng nhu cầu của bạn.


1
Đây thực sự là một giải pháp rất vững chắc nếu chúng ta gắn bó str_replace()!
Henrik Petterson

Là nó? Tôi có thể thấy nhiều trường hợp hơn khi nó không hoạt động
Flash Thunder

@Progrock có thể điều chỉnh nó theo cách mà nó được tính cho không gian sau &nbsp;? Ví dụ:"&nbsp; \n"
Henrik Petterson

@HenrikPetterson no
Flash Thunder

1

Bạn có thể sử dụng biểu thức chính quy cho điều này, sử dụng các công cụ sửa đổi DOTALL và MULTILINE cùng với các xác nhận nhìn xung quanh:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) ĐA NĂNG (m)
  • (?<=\n): đặt trước dòng mới (không phải là một phần của trận đấu)
  • \s*&nbsp;\s*: đơn & nbsp; với khoảng trắng xung quanh tùy chọn
  • (?=\n): theo dõi dòng mới (không phải là một phần của trận đấu)
>>> $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

Bạn có thể chia thành các dòng sau đó thay thế &nbsp;cho chuỗi trống trên các dòng chỉ chứa a &nbsp;và khoảng trắng.

Chúng tôi sẽ giữ các kết thúc dòng ban đầu, bằng cách bắt chúng.

<?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);

Đầu ra:

string(40) "
   hello&nbsp;world

   &nbsp;hello
"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.