ลบคำเฉพาะเมื่อมันอยู่ในบรรทัดของตัวเอง


16

ฉันมีสิ่งนี้:

$text = '
   hello world
    
    hello
';

ฉันจะลบ  เฉพาะเมื่อมันอยู่ในสายของตัวเองได้อย่างไร ดังนั้นด้วยตัวอย่างข้างต้น ควรลบวินาทีที่สองออก ผลลัพธ์ควรเป็น:

$text = '
   hello world

    hello
';

สิ่งที่ฉันได้ลองมาแล้ว

ผ่านstr_replace()ฉันสามารถ:

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

แต่นั่นจะลบอินสแตนซ์ทั้งหมดของ ไม่ใช่เฉพาะเมื่ออยู่ในบรรทัดของตัวเอง


6
การเพิ่มที่สวยงามของสิ่งที่ฉันได้พยายามมาแล้ว - ควรเป็นมาตรฐานในเว็บไซต์นี้ +1
Gary Woods

2
@misorude โปรดโพสต์คำตอบด้วยวิธีการของคุณ
Henrik Petterson

1
@OfirBaruch ฉันพยายาม$text = str_replace('\n'.' '.'\n', '', $text);แต่ไม่ทำงาน ดู
Henrik Petterson

3
@FlashThunder ทำไมคุณไม่โพสต์คำตอบโดยใช้str_replace()แทนที่จะตัดสินประสบการณ์ของฉัน =)
Henrik Petterson

2
@misorude แต่นี่คือสิ่งที่คุณจะต้องพูดคุยกับชุมชนมากกว่าที่ meta ถ้าคุณรู้สึกว่ามันเป็นปัญหาทั่วทั้งไซต์ ทำไมคุณถึงผลักดันที่นี่?
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 สิ่งที่ฉันมีเป็นผลลัพธ์ที่สอดคล้องทั้งหมดกับผลลัพธ์ที่ได้รับการร้องขอโดยคำถาม หากคุณตรวจสอบผลลัพธ์ของฉันเหมือนกับข้อกำหนด inital :) คุณลองรันโค้ดของฉันใน PHP 7 หรือไม่? คุณได้รับผลลัพธ์อื่น ๆ หรือไม่?
Merianos Nikos

ฉันจะบอกว่าผู้เขียนไม่ทราบด้วยซ้ำว่ามีแท็บ / ช่องว่างบางส่วนอยู่ในนั้นเนื่องจากเขาถูกถามในความคิดเห็นอื่นเกี่ยวกับช่องว่างหลังจากนั้น (และไม่มีในนั้น)
Flash Thunder

@FlashThunder ฉันรู้ ฉันแค่ขอตัวอย่างกรณี
Henrik Petterson

1
โอ้ต้องเป็น missclick
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
ผลลัพธ์ของรหัสของคุณไม่เหมือนกับสิ่งที่ถูกถาม: / `` `สวัสดี & nbsp; โลก & nbsp; สวัสดี` `` ความต้องการเริ่มต้นคือการแทนที่ ด้วยข้อความเปล่าโดยไม่ต้องใช้ทั้งบรรทัด: / นอกจากนี้ยังเก็บไว้ในใจไม่ได้ผมว่า 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
ฉันทดสอบแล้วใช้งานไม่ได้ :) โปรดจำไว้ว่าฉันไม่ได้ให้คะแนนโหวตคุณ นั่นเป็นเพียงความคิดเห็นที่เป็นมิตร :) ผลลัพธ์ยังคงไม่เปลี่ยนแปลงหลังจากทดสอบโซลูชันของคุณ
Merianos Nikos

@MerianosNikos มันเป็นยังไงบ้าง ?? sandbox.onlinephpfunctions.com/code/…
Flash Thunder

1
นั่นคือสิ่งที่ผมได้รับในท้องถิ่นของฉันเมื่อฉันเรียกใช้รหัสของคุณ: pasteboard.co/IUkf2MK.png :)
Merianos Nikos

2
@MerianosNikos โอ้ตลกทำงานบน PHP5 แต่ไม่ทำงานบน PHP7
Flash Thunder

บางทีคุณพูดถูก ฉันรันมันใน php 7
Merianos Nikos

1

หากคุณทราบถึงจุดสิ้นสุดบรรทัดและ&nbsp;ตามด้วยบรรทัดใหม่เสมอ:

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


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

เอาท์พุท (ช่องว่าง intial บางส่วนหายไปในการจัดรูปแบบที่นี่):

   hello&nbsp;world

   &nbsp;hello

Caveat: บรรทัดใด ๆ ที่ลงท้ายด้วย a &nbsp;กับเนื้อหาอื่น ๆ ที่มาก่อนก็จะได้รับผลกระทบดังนั้นสิ่งนี้อาจไม่ตรงกับความต้องการของคุณ


1
นี่เป็นทางออกที่มั่นคงมากหากเรายึดติดstr_replace()!
Henrik Petterson

ใช่ไหม? ฉันสามารถดูกรณีเพิ่มเติมเมื่อมันไม่ทำงาน
Flash Thunder

@Progrock เป็นไปได้หรือไม่ที่จะปรับในลักษณะที่จะนับพื้นที่หลังจาก&nbsp;? ตัวอย่างเช่น:"&nbsp; \n"
Henrik Petterson

@HenrikPetterson no
Flash Thunder

1

คุณสามารถใช้นิพจน์ทั่วไปสำหรับสิ่งนี้โดยใช้ตัวดัดแปลง DOTALL และ MULTILINE ร่วมกับการตรวจสอบยืนยัน:

preg_replace("~(?sm)(?<=\n)\s*&nbsp;(?=\n)~", '',$text);
  • (?sm): DOTALL (s) MULTILINE (m)
  • (?<=\n): นำหน้า newline (ไม่ใช่ส่วนหนึ่งของการแข่งขัน)
  • \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.