Phù hợp với một không gian trong regex


229

Tôi cần khớp một ký tự khoảng trắng trong biểu thức chính quy PHP. Bất cứ ai có ý tưởng?

Ý tôi là như "gavin schulz", khoảng trống ở giữa hai từ. Tôi đang sử dụng một biểu thức chính quy để đảm bảo rằng tôi chỉ cho phép các chữ cái, số và khoảng trắng. Nhưng tôi không chắc làm thế nào để tìm không gian. Đây là những gì tôi có ngay bây giờ:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);

2
Hmm ... cũng không có câu hỏi nào về việc khớp 'a' hoặc 'b' ...;)

1
bạn sẽ thấy các ví dụ regex
T.Todua

Câu trả lời:


368

Nếu bạn đang tìm kiếm một không gian, đó sẽ là " " (một không gian).

Nếu bạn đang tìm kiếm một hoặc nhiều, thì đó là " *"(đó là hai dấu cách và dấu hoa thị) hoặc" +" (một cộng).

Nếu bạn đang tìm kiếm khoảng cách chung, sử dụng "[ X]"hoặc "[ X][ X]*"hoặc "[ X]+"ở đâuX là ký tự tab vật lý (và từng được đi trước bởi một không gian duy nhất trong tất cả những ví dụ).

Chúng sẽ hoạt động trong mọi công cụ * regex mà tôi từng thấy (một số trong số đó thậm chí không có một hoặc nhiều hơn"+" ký tự , ugh).

Nếu bạn biết bạn sẽ sử dụng một trong những công cụ regex hiện đại hơn, "\s" và các biến thể của nó là hướng đi. Ngoài ra, tôi tin rằng ranh giới từ cũng khớp với bắt đầu và kết thúc của dòng, quan trọng khi bạn đang tìm kiếm các từ có thể xuất hiện mà không có trước hoặc sau khoảng trắng.

Đối với PHP cụ thể, trang này có thể giúp đỡ.

Từ chỉnh sửa của bạn, có vẻ như bạn muốn xóa tất cả các ký tự không hợp lệ Bắt đầu điều này là (lưu ý khoảng trắng bên trong biểu thức chính quy):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

Nếu bạn cũng muốn có mánh khóe để đảm bảo chỉ có một khoảng trống giữa mỗi từ và không có từ nào ở đầu hoặc cuối, thì điều đó phức tạp hơn một chút (và có thể là một câu hỏi khác) nhưng ý tưởng cơ bản sẽ là:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

Regex ban đầu của anh ấy dường như muốn thay thế nhân vật "". Bạn đang phủ nhận không gian, do đó, không gian của anh ấy sẽ không bị "xóa" như dự định.
Khởi động

Trích dẫn: "chỉ cho phép chữ cái, số và khoảng trắng", RE gốc của Gavin đã sai (đó là lý do tại sao anh ấy đặt câu hỏi). RE của tôi xóa mọi thứ không phải là một trong số đó.
paxdiablo

Tại sao không gian phải ở cuối mẫu khớp thay vì nói ở giữa?
warren

1
@warren, nó không. Các 'không gian ở đây' bình luận đã không được nêu nơi không gian đi, chứ không phải người ta nói rằng đã có một không gian ở đó (trong trường hợp người đọc đã không nhận ra).
paxdiablo

@Mike, không, không phải vậy. Mục đích ở đây là thay thế tất cả các ký tự không có trong tập hợp A-Za-z.... Các dấu mũ bên trong dấu ngoặc vuông ra lệnh đó. Di chuyển dấu mũ bên ngoài dấu ngoặc vuông sẽ thay đổi ý nghĩa của nó thành các ký tự khớp trong tập hợp ở đầu chuỗi.
paxdiablo


34

Đây là tất cả mọi thứ bạn cần biết về khoảng trắng trong các biểu thức thông thường:

  • [[:blank:]] Chỉ khoảng trắng hoặc tab
  • [[:space:]] Khoảng trắng
  • \s Bất kỳ ký tự khoảng trắng
  • \v Khoảng trắng dọc
  • \h Khoảng trắng ngang
  • x Bỏ qua khoảng trắng

5

Đối với tôi, dường như việc sử dụng REGEX trong trường hợp này sẽ là quá mức cần thiết. Tại sao không chỉ chỉ strpos để tìm ra nhân vật không gian. Ngoài ra, không có gì đặc biệt về ký tự không gian trong các biểu thức thông thường, bạn sẽ có thể tìm kiếm nó giống như bạn sẽ tìm kiếm bất kỳ ký tự nào khác. Đó là, trừ khi bạn vô hiệu hóa khoảng trắng mẫu, điều này hầu như không cần thiết trong trường hợp này.


5

Trong Perl, công tắc là \s(khoảng trắng).


16
Điều này không chính xác - nó tập hợp tất cả các khoảng trắng, không chỉ là ký tự khoảng trắng.
J. Taylor

Nhưng câu hỏi được gắn thẻ với PHP, không phải Perl.
Peter Mortensen

4

Tôi đang sử dụng biểu thức chính quy để đảm bảo rằng tôi chỉ cho phép chữ cái, số và khoảng trắng

Sau đó, đơn giản như việc thêm một khoảng trắng vào những gì bạn đã có:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(lưu ý, tôi đã xóa s|cái dường như vô ý? Chắc chắn slà không cần thiết; bạn có thể khôi phục| nếu bạn cần)

Nếu bạn đặc biệt muốn không gian * a *, vì chỉ trong một không gian duy nhất, bạn sẽ cần một biểu thức phức tạp hơn mức này và có thể muốn xem xét một đoạn logic phi regex riêng biệt.


3

Bạn cũng có thể sử dụng \ b cho một ranh giới từ. Đối với tên tôi sẽ sử dụng một cái gì đó như thế này:

[^\b]+\b[^\b]+(\b|$)

BIÊN TẬP Sửa đổi điều này thành một biểu thức chính quy trong ví dụ Perl

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

EDIT LẠI Dựa trên những gì bạn muốn:

$new_tag = preg_replace("/[\s\t]/","",$tag);

1

Tôi đang thử [[: space:]] trong một trường hợp có vẻ như các blogger trong WordPress đang sử dụng các ký tự không gian không chuẩn. Có vẻ như nó sẽ hoạt động.


1

Sử dụng nó như thế này để cho phép không gian duy nhất.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
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.