ลบช่องว่างส่วนเกินออกจากภายในสตริง


138

ฉันได้รับสตริงจากแบบสอบถามฐานข้อมูลจากนั้นฉันจะลบแท็ก HTML ทั้งหมดการคืนค่าขนส่งและบรรทัดใหม่ก่อนที่จะใส่ลงในไฟล์ CSV สิ่งเดียวคือฉันไม่สามารถหาวิธีลบช่องว่างสีขาวส่วนเกินออกจากระหว่างสตริงได้

วิธีใดเป็นวิธีที่ดีที่สุดในการลบอักขระช่องว่างภายใน


6
กรุณาโพสต์ตัวอย่างสตริงต้นฉบับและสตริงที่ต้องการ
Zote

คุณสามารถอธิบายให้ชัดเจนว่าผลลัพธ์สุดท้ายต้องเป็นอย่างไร? คุณกำลังแทรกเครื่องหมายจุลภาคลงในข้อมูลสำหรับ CSV โดยนำมาจากฐานข้อมูลที่มีเครื่องหมายจุลภาคอยู่แล้วป้อนสตริงลงในฟังก์ชันที่จัดการการแทรก CSV เป็นต้นหรือไม่
Frank DeRosa

ตกลงคำสุดท้ายจะต้องเป็นสตริงที่มีแต่ละคำคั่นด้วยช่องว่างเดียวในขณะนี้เป็นช่องว่างหลายช่อง
joepour

1
@ โจฉันจะไม่เสียเวลาและจะเริ่มให้เครดิตกับทุกคนที่เคยช่วยเหลือคุณมาก่อน! :)
Frankie

คำตอบ:


293

ไม่แน่ใจว่าต้องการอะไรแน่นอน แต่มีสองสถานการณ์ดังนี้

  1. หากคุณเป็นเพียงการจัดการกับส่วนเกินwhitespaceในจุดเริ่มต้นหรือจุดสิ้นสุดของสตริงที่คุณสามารถใช้trim(), ltrim()หรือrtrim()จะเอามันออก

  2. ถ้าคุณจะจัดการกับช่องว่างพิเศษภายในสตริงพิจารณาpreg_replaceหลายมีเพียงหนึ่งเดียวwhitespaces " "*whitespace " "

ตัวอย่าง:

$foo = preg_replace('/\s+/', ' ', $foo);

62
$ foo = preg_replace ('/ \ s + /', '', $ foo);
genio

ใช้$foo = preg_replace( '/\s+/', ' ', $foo );เจตจำนงฆ่าผลของnl2br()
Waiyl Karim

1
เพียงใช้ nl2br ก่อนที่จะใช้ preg_replace และคุณควรจะไป
Lukas Liesis

หมายเหตุ Typo / Escaper - หากโค้ดไม่ได้ลบช่องว่างพิเศษให้คุณ - ตรวจสอบให้แน่ใจว่าคุณมี "\" before "s" :) หน้าทดสอบ php ออนไลน์บางหน้าลบออก :)
jave.web

นี่ควรเป็น CSS ที่ปลอดภัยใช่ไหม? เช่นนี้จะบีบอัดตัวแปรที่มีสตริง CSS แบบหลายบรรทัดแบบยาวได้อย่างปลอดภัยหรือไม่?
David

51
$str = str_replace(' ','',$str);

หรือแทนที่ด้วยขีดล่าง & nbsp; ฯลฯ เป็นต้น


8
สิ่งนี้จะลบช่องว่างทั้งหมด เขาแค่ต้องการทำให้สตริงเป็นปกติ
Svend

13
สิ่งที่ฉันกำลังมองหา (แม้ว่าจะไม่ใช่คำถามก็ตาม)
Robert Johnstone

@Gigala "อะไรคือวิธีที่ดีที่สุดในการลบอักขระช่องว่างภายใน" คือคำถาม คำตอบนี้ตอบสนองความต้องการได้อย่างสมบูรณ์แบบ
Cory Dee

1
@CoryDee นั่นเป็นความจริงสำหรับประโยคสุดท้ายนั้น แต่ในบทนำคำถามจะถูกเขียนว่าเป็น " ช่องว่างส่วนเกิน " โดยเน้นที่ส่วนเกิน คุณพอใจกับปัญหาที่เกิดขึ้นจริงของ OP ดังนั้นมันจึงไม่สำคัญมากนัก แต่ตราบใดที่เราได้รับข้อมูลทางเทคนิค ...
Spencer Ruskin

สิ่งนี้จะใช้ไม่ได้หากนับจากช่องว่างที่เป็นเลขคู่ให้พูด: Hi Earthมี 4 ช่องว่างHiEarthในระหว่างจะกลายเป็น: สิ่งนี้ไม่ได้ช่วยแก้ปัญหาของฉันเกี่ยวกับคำถามที่เกี่ยวข้อง
JJ Labajo

26

$str = trim(preg_replace('/\s+/',' ', $str));

บรรทัดของโค้ดด้านบนจะลบช่องว่างพิเศษรวมทั้งช่องว่างนำหน้าและต่อท้าย


25

ไม่มีตัวอย่างอื่นที่ใช้ได้ผลสำหรับฉันฉันจึงใช้ตัวอย่างนี้:

trim(preg_replace('/[\t\n\r\s]+/', ' ', $text_to_clean_up))

สิ่งนี้จะแทนที่แท็บทั้งหมดบรรทัดใหม่ช่องว่างคู่และอื่น ๆ เป็น 1 ช่องว่าง


ขอบคุณ @ wp78de แต่ด้วยเหตุผลใด ๆ \s+ผมมีปัญหาเกี่ยวกับเพียง แม้ว่ามันจะย้อนกลับไปในปี 2014 ดังนั้นอาจจะมีการเปลี่ยนแปลงไม่ได้สัมผัส PHP ในช่วง 3 ปีที่ผ่านมาไม่สามารถแสดงความคิดเห็นได้ แต่จะให้คำตอบปัจจุบันในขณะที่เป็นวิธีแก้ปัญหาและอาจยังคงมีอยู่ในบางกรณี
Lukas Liesis

9

หากคุณต้องการแทนที่เฉพาะช่องว่างหลาย ๆ ช่องในสตริงตัวอย่าง: "this string have lots of space . " และคุณคาดว่าคำตอบจะเป็น "this string have lots of space"คุณสามารถใช้วิธีแก้ไขปัญหาต่อไปนี้:

$strng = "this string                        have lots of                        space  .   ";

$strng = trim(preg_replace('/\s+/',' ', $strng));

echo $strng;

5

มีข้อบกพร่องด้านความปลอดภัยในการใช้ preg_replace () หากคุณได้รับเพย์โหลดจากการป้อนข้อมูลของผู้ใช้ [หรือแหล่งที่มาอื่น ๆ ที่ไม่น่าเชื่อถือ] PHP รันนิพจน์ทั่วไปด้วย eval () ถ้าสตริงเข้ามาจะไม่ชัดเจนพอแอพลิเคชันของคุณเสี่ยงถูกยัดเยียดให้ฉีดรหัส

ในแอปพลิเคชันของฉันเองแทนที่จะรบกวนการทำความสะอาดอินพุต (และในขณะที่ฉันจัดการกับสตริงสั้น ๆ เท่านั้น) ฉันได้สร้างฟังก์ชันที่เข้มข้นของโปรเซสเซอร์ขึ้นเล็กน้อยแทนแม้ว่าจะมีความปลอดภัยเนื่องจากไม่ได้ประเมิน () อะไรเลย

function secureRip(string $str): string { /* Rips all whitespace securely. */
  $arr = str_split($str, 1);
  $retStr = '';
  foreach ($arr as $char) {
    $retStr .= trim($char);
  }
  return $retStr;
}

มันจะดำเนินการโดยใช้ eval เท่านั้นหากคุณระบุ 'e' modifiedier: php.net/manual/en/…มันยังบอกอีกว่า "ฟีเจอร์นี้ถูกยกเลิกใน PHP 5.5.0 และถูกลบออกเมื่อ PHP 7.0.0 " คุณจึงไม่สามารถประเมินสิ่งต่างๆใน preg_replace ได้อีกต่อไป
ADJenks


2

คุณสามารถใช้ได้:

$str = trim(str_replace("  ", " ", $str));

สิ่งนี้จะลบช่องว่างที่เกินออกจากสตริงทั้งสองด้านและแปลงช่องว่างสองช่องให้เป็นช่องว่างภายในสตริง โปรดทราบว่าสิ่งนี้จะไม่แปลงช่องว่างสามช่องขึ้นไปในแถวเป็นช่องเดียว! อีกวิธีหนึ่งที่ฉันสามารถแนะนำได้คือการใช้ระเบิดและระเบิดซึ่งปลอดภัยกว่า แต่ไม่เหมาะสมโดยสิ้นเชิง!

$str = implode(" ", array_filter(explode(" ", $str)));

คำแนะนำของฉันใช้เนทีฟสำหรับลูปหรือใช้นิพจน์ทั่วไปเพื่อทำงานประเภทนี้


สิ่งนี้ไม่ได้แปลงช่องว่างหลายช่องอย่างถูกต้องโดยที่ช่องว่างยาวเกินสองช่อง
mikeybeck

1

เพื่อขยายคำตอบของ Sandip ฉันมีสตริงจำนวนมากปรากฏขึ้นในบันทึกที่เข้ารหัสผิดใน bit.ly พวกเขาตั้งใจจะโค้ดแค่ URL แต่ใส่ที่จับ twitter และอื่น ๆ หลังจากเว้นวรรค มันเป็นแบบนี้

? productID =26%20via%20@LFS

โดยปกตินั่นจะไม่ใช่ปัญหา แต่ฉันได้รับความพยายามในการฉีด SQL จำนวนมากดังนั้นฉันจึงเปลี่ยนเส้นทางสิ่งที่ไม่ใช่ ID ที่ถูกต้องไปยัง 404 ฉันใช้เมธอด preg_replace เพื่อสร้างสตริง productID ที่ไม่ถูกต้องให้เป็น รหัสผลิตภัณฑ์ที่ถูกต้อง

$productID=preg_replace('/[\s]+.*/','',$productID);

ฉันมองหาช่องว่างใน URL แล้วลบทุกอย่างออก


0

เมื่อเร็ว ๆ implode(' ', array_filter(explode(' ', $str)))นี้ผมเขียนฟังก์ชั่นที่เรียบง่ายที่เอาพื้นที่สีขาวส่วนเกินออกจากสตริงโดยไม่ต้องแสดงออกปกติ


-1
$str = "I      am a PHP   Developer";
$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.