Xóa khoảng trắng thừa từ bên trong chuỗi


132

Tôi nhận được một chuỗi từ truy vấn cơ sở dữ liệu, sau đó tôi xóa tất cả các thẻ HTML, trả về vận chuyển và dòng mới trước khi tôi đặt nó vào tệp CSV. Chỉ có điều, tôi không thể tìm cách xóa khoảng trắng thừa từ giữa các chuỗi.

Điều gì sẽ là cách tốt nhất để loại bỏ các ký tự khoảng trắng bên trong?


6
Xin vui lòng, gửi một mẫu của chuỗi gốc và chuỗi mong muốn.
Zote

Bạn cũng có thể làm rõ đầu ra cuối cùng cần phải như thế nào? Bạn có đang chèn dấu phẩy vào dữ liệu cho CSV, nhận dữ liệu từ cơ sở dữ liệu đã có dấu phẩy, cung cấp chuỗi vào chức năng xử lý chèn CSV, v.v.?
Frank DeRosa

ok cuối cùng đưa ra cần phải là một chuỗi với mỗi từ được phân tách bằng một khoảng trắng duy nhất, tại thời điểm này nó là một khoảng trắng nhiều.
tham gia

1
@Joe, tôi sẽ không lãng phí thời gian và sẽ bắt đầu cung cấp tín dụng cho tất cả những người đã giúp bạn trước đây! :)
Frankie

Câu trả lời:


286

Không chắc chắn chính xác những gì bạn muốn nhưng đây là hai tình huống:

  1. Nếu bạn chỉ là đối phó với dư thừa whitespacetrên đầu hoặc cuối của chuỗi bạn có thể sử dụng trim(), ltrim()hoặc rtrim()để loại bỏ nó.

  2. Nếu bạn đang xử lý các khoảng trắng thừa trong một chuỗi, hãy xem xét một preg_replacebội số whitespaces " "*với một chuỗi whitespace " ".

Thí dụ:

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

62
$ foo = preg numplace ('/ \ s + /', '', $ foo);
gen

sử dụng ý $foo = preg_replace( '/\s+/', ' ', $foo );chí sẽ giết chết các hiệu ứng củanl2br()
Waiyl Karim

1
chỉ cần sử dụng nl2br trước khi sử dụng preg numplace và bạn sẽ thấy ổn.
Lukas Liesis

Ghi chú Typo / Escaper - nếu mã không xóa thêm khoảng trắng cho bạn - hãy đảm bảo bạn có "\" trước "s" :) một số trang kiểm tra php trực tuyến sẽ xóa nó :)
jave.web

Điều này nên được CSS an toàn, phải không? Như trong, điều này sẽ nén một cách an toàn một biến giữ một chuỗi CSS dài, nhiều dòng?
David

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

Hoặc, thay thế bằng dấu gạch dưới, & nbsp; Vân vân.


7
Điều này loại bỏ tất cả các khoảng trắng. Anh ta chỉ muốn bình thường hóa chuỗi.
Svend

12
Những gì tôi đang tìm kiếm (mặc dù đó không phải là câu hỏi)
Thứ bảy

@Gigala "Điều gì sẽ là cách tốt nhất để loại bỏ các ký tự khoảng trắng bên trong?" là câu hỏi Câu trả lời này thỏa mãn điều đó một cách hoàn hảo.
Cory Dee

1
@CoryDee Điều đó đúng, cho câu cuối cùng đó. Nhưng trong phần giới thiệu, câu hỏi được đặt ra là " khoảng trắng thừa ", nhấn mạnh vào phần thừa. Cuối cùng bạn đã thỏa mãn vấn đề THỰC TẾ của OP, vì vậy nó không thành vấn đề, nhưng miễn là chúng tôi có được kỹ thuật về nó ...
Spencer Ruskin

Điều này không hoạt động nếu số lượng của không giansố chẵn , chúng ta hãy nói: Hi Earthvới 4 không gian ở giữa sẽ trở thành: HiEarth. Điều này không giải quyết vấn đề của tôi liên quan đến câu hỏi.
JJ Labajo

26

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

Dòng mã trên sẽ loại bỏ các khoảng trắng thừa , cũng như các khoảng trắng ở đầu và cuối.


25

không có ví dụ nào khác làm việc cho tôi, vì vậy tôi đã sử dụng ví dụ này:

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

cái này thay thế tất cả các tab, dòng mới, dấu cách kép, vv thành 1 khoảng trắng đơn giản.


Cảm ơn, @ wp78de nhưng vì bất kỳ lý do gì, tôi đã gặp vấn đề với chỉ \s+. Mặc dù nó đã trở lại vào năm 2014 nên có thể nó đã thay đổi, đã không chạm vào PHP trong 3 năm qua, không thể bình luận nhưng sẽ để lại câu trả lời hiện tại trong khi đó là một giải pháp và vẫn có thể trong một số trường hợp.
Lukas Liesis

9

Nếu bạn muốn chỉ thay thế nhiều khoảng trắng trong một chuỗi, ví dụ: "this string have lots of space . " Và bạn mong đợi câu trả lời là "this string have lots of space", bạn có thể sử dụng giải pháp sau:

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

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

echo $strng;

5

Có những lỗi bảo mật khi sử dụng preg numplace (), nếu bạn nhận được tải trọng từ đầu vào của người dùng [hoặc các nguồn không đáng tin cậy khác]. PHP thực hiện biểu thức chính quy với eval (). Nếu chuỗi đến không được vệ sinh đúng cách, ứng dụng của bạn có nguy cơ bị tiêm mã .

Trong ứng dụng của riêng tôi, thay vì làm phiền vệ sinh đầu vào (và vì tôi chỉ xử lý các chuỗi ngắn), thay vào đó tôi đã thực hiện một chức năng chuyên sâu hơn một chút về bộ xử lý, mặc dù nó an toàn, vì nó không làm bất cứ điều gì.

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

Nó chỉ thực hiện nó bằng cách sử eval nếu bạn chỉ định 'e' modifyier: php.net/manual/en/... nó cũng nó nói rằng "Tính năng này đã NỮA trong PHP 5.5.0, và REMOVED như của PHP 7.0.0. " Vì vậy, bạn không thể eval thứ trong preg numplace nữa.
ADJenks


2

Bạn có thể dùng:

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

Điều này loại bỏ khoảng trắng thừa từ cả hai phía của chuỗi và chuyển đổi hai khoảng trắng thành một khoảng trắng trong chuỗi. Lưu ý rằng điều này sẽ không chuyển đổi ba hoặc nhiều không gian liên tiếp thành một! Một cách khác tôi có thể đề xuất là sử dụng implode và phát nổ an toàn hơn nhưng hoàn toàn không tối ưu!

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

Đề nghị của tôi là sử dụng vòng lặp gốc hoặc sử dụng regex để thực hiện loại công việc này.


Điều này không chuyển đổi nhiều không gian chính xác trong đó không gian dài hơn hai không gian.
mikeybeck

1

Để mở rộng câu trả lời của Sandip, tôi đã có một chuỗi các chuỗi hiển thị trong nhật ký được mã hóa sai trong bit.ly. Họ có nghĩa là chỉ mã URL nhưng đặt một tay cầm twitter và một số thứ khác sau một khoảng trắng. Nó trông như thế này

? productID =26%20via%20@LFS

Thông thường, đó sẽ không phải là vấn đề, nhưng tôi nhận được rất nhiều lần thử SQL, vì vậy tôi chuyển hướng bất cứ thứ gì không phải là ID hợp lệ sang 404. Tôi đã sử dụng phương thức preg numplace để biến chuỗi ProductID không hợp lệ thành một sản phẩm hợp lệID.

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

Tôi tìm một khoảng trống trong URL và sau đó xóa mọi thứ sau nó.


0

Gần đây tôi đã viết một hàm đơn giản giúp loại bỏ khoảng trắng thừa khỏi chuỗi mà không có biểu thức chính quy 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);
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.