ลบช่องว่างหลายช่อง


208

ฉันได้รับ$row['message']จากฐานข้อมูล MySQL และฉันต้องการลบช่องว่างทั้งหมดเช่น\n \tนั้น

$row['message'] = "This is   a Text \n and so on \t     Text text.";

ควรจัดรูปแบบเป็น:

$row['message'] = 'This is a Text and so on Text text.';

ฉันเหนื่อย:

 $ro = preg_replace('/\s\s+/', ' ',$row['message']);
 echo $ro;

แต่มันไม่ได้ลบ\nหรือ\tเพียงแค่ช่องว่างเดียว ใครสามารถบอกฉันว่าจะทำเช่นนั้นได้อย่างไร


1
อักขระขึ้นบรรทัดใหม่และแท็บอยู่ในเครื่องหมายคำพูดเดี่ยวดังนั้นคุณจึงต้องการให้เป็นตัวอักษร?
Mark Lalor

ฉันแก้ไขการอ้างอิงของรหัสส่วนด้วย \ n และ \ t โดยเปลี่ยนเป็นเครื่องหมายคำพูดคู่
Buttle Butkus

คำตอบ:


394

คุณต้องการ:

$ro = preg_replace('/\s+/', ' ',$row['message']);

คุณกำลังใช้\s\s+ซึ่งหมายถึงช่องว่าง (ช่องว่างแท็บหรือขึ้นบรรทัดใหม่) ตามด้วยช่องว่างอย่างน้อยหนึ่งช่อง ซึ่งหมายถึงการแทนที่ช่องว่างอย่างน้อยสองรายการด้วยช่องว่างเดียว

สิ่งที่คุณต้องการคือแทนที่ช่องว่างอย่างน้อยหนึ่งช่องว่างด้วยช่องว่างเดี่ยวเพื่อให้คุณสามารถใช้รูปแบบ \s\s*หรือ\s+(แนะนำ)


1
วิธีการของเขาดีกว่านี้: ทำไมคุณจะแทนที่หนึ่งช่องว่างด้วยช่องว่างเดียว?
nickf

16
เขาต้องการให้ \ n และ \ t ถูกแทนที่ด้วยช่องว่าง ตอนนี้รูปแบบของเขาไม่ตรงกับสิ่งเหล่านี้พูดเพื่อ $ x = "ทำ \ n นี่ \ twork"; OP ต้องการให้ช่องว่างทั้งหมดถูกแทนที่ด้วยช่องว่างเดียว
codaddict

@caddaddict เราจะเก็บ \ n และลบช่องว่างและแท็บหลาย ๆ แท็บออกจากสตริงได้อย่างไร? โปรดช่วยฉันด้วย
Mansoorkhan Cherupuzha

คุณจะเจาะจงมากกว่านี้ได้หรือไม่เพราะเหตุใดจึงแนะนำ "\ s +"
Isius

6
โปรดทราบว่าใน PHP \sไม่รวมถึงแท็บ chr(11)"แนวตั้ง" หากต้องการรวมไว้ด้วยคุณต้องใช้spaceคลาสอักขระ: [[:space:]]+ php.net/manual/en/regexp.reference.character-classes.php
Yaroslav

68
<?php
$str = "This is  a string       with
spaces, tabs and newlines present";

$stripped = preg_replace(array('/\s{2,}/', '/[\t\n]/'), ' ', $str);

echo $str;
echo "\n---\n";
echo "$stripped";
?>

ผลลัพธ์นี้

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present

3
คุณเป็นผู้ช่วยชีวิตที่แท้จริง ฉันกำลังจะกระโดดออกไปถ้าหน้าต่างมากกว่านี้
bikey77

เรียบร้อยยังมีประโยชน์
spekulatius

16
preg_replace('/[\s]+/mu', ' ', $var);

\s มีแท็บและบรรทัดใหม่อยู่แล้วดังนั้น regex ด้านบนจึงมีความเพียงพอ


2
ไม่จำเป็นต้องใช้วงเล็บเหลี่ยมที่นี่เพราะมีเพียงสิ่งเดียวที่อยู่ภายใน /mเคยชินมีผลกระทบที่ไม่มี^หรือ$เบรกและ/uจะไม่มีผลกระทบใด ๆ ยกเว้นที่จะชะลอตัวลงเล็กน้อยและตายถ้าสายป้อนไม่ถูกต้อง UTF-8 (มันไม่ได้ส่งผลกระทบต่อสิ่งที่\sตรง แต่มันจะส่งผลกระทบต่อ\pZ)
thomasrutter

12

ย่อเป็นฟังก์ชันเดียว:

function removeWhiteSpace($text)
{
    $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text);
    $text = preg_replace('/([\s])\1+/', ' ', $text);
    $text = trim($text);
    return $text;
}

ขึ้นอยู่กับคำตอบของ Danuel O'Neal


7
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);

2
นี่คือสิ่งที่ดีที่สุดสำหรับฉัน นอกจากนี้ฉันจะเพิ่มการตัดแต่งเพื่อลบช่องว่างในจุดเริ่มต้นและจุดสิ้นสุดของสตริง
Dziamid

@Dziamid คุณสามารถทำมันด้วยการตัด (preg_replace (... ))
Balázs Varga

7

ฉันไม่สามารถทำซ้ำปัญหาที่นี่:

$x = "this    \n \t\t \n    works.";
var_dump(preg_replace('/\s\s+/', ' ', $x));
// string(11) "this works."

ฉันไม่แน่ใจว่าเป็นเพียงข้อผิดพลาดในการถอดความหรือไม่ แต่ในตัวอย่างของคุณคุณกำลังใช้สตริงที่มีเครื่องหมายคำพูดเดี่ยว \nและ\tจะถือว่าเป็นบรรทัดใหม่และแท็บหากคุณมีสตริงที่ยกมาสองครั้ง นั่นคือ:

'\n\t' != "\n\t"

แก้ไข : ตามที่ Codaddict ชี้ให้เห็น\s\s+จะไม่แทนที่อักขระแท็บเดียว ฉันยังไม่คิดว่าการใช้\s+เป็นวิธีแก้ปัญหาที่มีประสิทธิภาพดังนั้นวิธีนี้แทน:

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);

2
+1, จริง สำหรับสตริงที่มีช่องว่างมากมาย (ซึ่งโดยปกติจะเป็นกรณี) มันไม่มีประสิทธิภาพในการแทนที่ช่องว่างด้วยช่องว่าง
codaddict

1
@coaddict: เพื่อทดสอบสมมติฐานของคุณฉันเขียนสคริปต์สั้น ๆ เพื่อให้ทำงานได้ถึง 1,000 รายการสำหรับการแทนที่แต่ละรายการและตรวจสอบเวลาของแต่ละรายการ สำหรับสตริง'+1, True สำหรับสตริงที่มีช่องว่างมากมาย (ซึ่งโดยปกติจะเป็นกรณี) มันไม่มีประสิทธิภาพในการแทนที่ช่องว่างด้วยช่องว่าง - codaddict 24 ก.พ. '10 เวลา 13:32 ' , หนึ่งพัน\ s + preg_replace () ใช้เวลา 0.010547876358032 วินาทีและหนึ่งพัน(?: \ s \ s + | \ n | \ t) preg_replace () โทร 0.013049125671387 มันช้าลงเกือบ 30%
Joseph Cheek

คุณอาจต้องการเพิ่ม "\ r" เป็นตัวอย่างสุดท้ายเนื่องจากคอมพิวเตอร์บางเครื่องใช้ "\ r" เพียงตัวเดียว (Apple Mac?)
thomasrutter

4
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

สิ่งนี้จะแทนที่แท็บทั้งหมดการขึ้นบรรทัดใหม่และการรวมกันของช่องว่างหลายแท็บและการขึ้นบรรทัดใหม่ด้วยช่องว่างเดียว


4
<?php
#This should help some newbies
# REGEX NOTES FROM DANUEL
# I wrote these functions for my own php framework
# Feel Free to make it better
# If it gets more complicated than this. You need to do more software engineering/logic.
# (.)  // capture any character
# \1   // if it is followed by itself
# +    // one or more

class whitespace{

    static function remove_doublewhitespace($s = null){
           return  $ret = preg_replace('/([\s])\1+/', ' ', $s);
    }

    static function remove_whitespace($s = null){
           return $ret = preg_replace('/[\s]+/', '', $s );
    }

    static function remove_whitespace_feed( $s = null){
           return $ret = preg_replace('/[\t\n\r\0\x0B]/', '', $s);
    }

    static function smart_clean($s = null){
           return $ret = trim( self::remove_doublewhitespace( self::remove_whitespace_feed($s) ) );
    }
}
$string = " Hey   yo, what's \t\n\tthe sc\r\nen\n\tario! \n";
echo whitespace::smart_clean($string);

ฟังก์ชั่นคงที่ คุณกำหนด แต่ไม่เคยใช้
Lukas Liesis

แต่ละอันมีการใช้งาน แต่ไม่มีสิ่งใดที่จะบรรลุสิ่งที่คำถามถามว่าจะแทนที่ช่องว่างที่ต่อเนื่องกันหลายอันด้วยอันเดียว "remove_doublewhitespace" ของคุณจะแทนที่อักขระช่องว่างเดียวกันหลายรายการเท่านั้นดังนั้นจึงจะแทนที่ "\ n \ n \ n" ด้วย '' แต่จะไม่ทำอะไรกับ "\ r \ n"
thomasrutter

4

ไม่มี preg_replace ()

$str = "This is   a Text \n and so on \t     Text text.";
$str = str_replace(["\r", "\n", "\t"], " ", $str);
while (strpos($str, "  ") !== false)
{
    $str = str_replace("  ", " ", $str);
}
echo $str;

2

ฉันใช้รหัสและรูปแบบนี้:

preg_replace('/\\s+/', ' ',$data)

$data = 'This is   a Text 
   and so on         Text text on multiple lines and with        whitespaces';
$data= preg_replace('/\\s+/', ' ',$data);
echo $data;

คุณสามารถทดสอบสิ่งนี้ได้ที่http://writecodeonline.com/php/


มันใช้งานได้กับฉันแม้ใน mariaDB ในแบบสอบถามนี้: SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 ดังนั้นขอบคุณมาก
jalmatari


1

นี่คือสิ่งที่ฉันจะใช้:

ตรวจสอบให้แน่ใจว่าใช้เครื่องหมายคำพูดคู่เช่น:

$row['message'] = "This is   a Text \n and so on \t     Text text.";

ข หากต้องการลบช่องว่างพิเศษให้ใช้:

$ro = preg_replace('/\s+/', ' ', $row['message']); 
echo $ro;

อาจไม่ใช่วิธีที่เร็วที่สุด แต่ฉันคิดว่ามันต้องใช้รหัสน้อยที่สุดและควรจะทำงาน แต่ฉันไม่เคยใช้ mysql ดังนั้นฉันอาจผิด


1

จากความจริงถ้าคิดว่าคุณต้องการอะไรแบบนี้:

preg_replace('/\n+|\t+|\s+/',' ',$string);


-2

โดยไม่ต้อง preg_replace ด้วยความช่วยเหลือของลูป

<?php

$str = "This is   a Text \n and so on \t     Text text.";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
    if (isset($str_arr[$i + 1])
       && $str_arr[$i] == ' '
       && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
    } 
    else {
      continue;
    }
}

 echo implode("", $str_arr) ; 

 ?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.