Mencocokkan ruang dalam regex

229

Saya perlu mencocokkan karakter spasi dalam ekspresi reguler PHP. Ada yang punya ide?

Maksud saya seperti "gavin schulz", ruang di antara dua kata. Saya menggunakan ekspresi reguler untuk memastikan bahwa saya hanya mengizinkan huruf, angka, dan spasi. Tapi saya tidak yakin bagaimana menemukan ruang. Inilah yang saya miliki sekarang:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
Gavin Schulz
sumber
2
Hmm ... juga tidak ada pertanyaan tentang mencocokkan sebuah 'a' atau a 'b' ...;)
1
Anda harus melihat contoh regex
T.Todua

Jawaban:

368

Jika Anda mencari ruang, itu akan menjadi " "(satu ruang).

Jika Anda mencari satu atau lebih, itu " *"(itu dua spasi dan tanda bintang) atau " +"(satu spasi dan plus).

Jika Anda sedang mencari jarak umum, penggunaan "[ X]"atau "[ X][ X]*"atau "[ X]+"di mana Xadalah karakter tab fisik (dan masing-masing didahului oleh satu ruang di semua contoh tersebut).

Ini akan bekerja di setiap mesin * regex yang pernah saya lihat (beberapa di antaranya bahkan tidak memiliki karakter satu atau lebih "+", ugh).

Jika Anda tahu Anda akan menggunakan salah satu mesin regex yang lebih modern, "\s"dan variasinya adalah cara untuk melakukannya. Selain itu, saya percaya batas kata cocok dengan awal dan akhir baris juga, penting ketika Anda mencari kata-kata yang mungkin muncul tanpa sebelumnya atau mengikuti spasi.

Khusus untuk PHP, halaman ini dapat membantu.

Dari hasil edit Anda, tampaknya Anda ingin menghapus semua karakter yang tidak valid. Awal dari ini adalah (perhatikan ruang di dalam regex):

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

Jika Anda juga ingin tipuan untuk memastikan hanya ada satu ruang antara setiap kata dan tidak ada pada awal atau akhir, itu sedikit lebih rumit (dan mungkin pertanyaan lain) tetapi ide dasarnya adalah:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end
paxdiablo
sumber
Regex aslinya sepertinya ingin mengganti karakter "". Anda meniadakan ruang, karena itu ruangnya tidak akan "dihapus" sebagaimana dimaksud.
Suroot
Mengutip: "hanya izinkan huruf, angka, dan spasi", RE asli Gavin salah (itulah sebabnya ia mengajukan pertanyaan). RE saya menghapus semua yang bukan salah satunya.
paxdiablo
Mengapa ruang harus di akhir pola pertandingan, bukannya, katakanlah, di tengah?
warren
1
@warren, tidak. Komentar 'spasi di sini' tidak menyatakan kemana perginya, melainkan menyatakan bahwa ada ruang di sana (kalau-kalau pembaca tidak menyadari).
paxdiablo
@ Mike, tidak, bukan itu masalahnya. Maksudnya di sini adalah untuk mengganti semua karakter yang tidak ada di set A-Za-z.... Tanda sisipan di dalam kurung kotak menentukan itu. Memindahkan tanda sisipan di luar tanda kurung kotak mengubah artinya menjadi karakter yang cocok dalam set di awal string.
paxdiablo
34

Berikut ini semua yang perlu Anda ketahui tentang spasi putih dalam ekspresi reguler:

  • [[:blank:]] Hanya spasi atau tab
  • [[:space:]] Ruang putih
  • \s Setiap karakter spasi putih
  • \v Ruang kosong vertikal
  • \h Ruang putih horisontal
  • x Abaikan spasi putih
Fletcher Ripp
sumber
5

Sepertinya saya suka menggunakan REGEX dalam hal ini hanya akan berlebihan. Mengapa tidak hanya hanya strpos untuk menemukan karakter spasi. Juga, tidak ada yang istimewa tentang karakter spasi dalam ekspresi reguler, Anda harus dapat mencarinya sama seperti Anda mencari karakter lain. Yaitu, kecuali Anda menonaktifkan spasi putih pola, yang tidak akan diperlukan dalam kasus ini.

Kibbee
sumber
5

Di Perl switch adalah \s(spasi).

Elsporko
sumber
16
Ini tidak benar - ia mengumpulkan semua spasi putih, bukan hanya karakter spasi.
J. Taylor
Tapi pertanyaannya ditandai dengan PHP, bukan Perl.
Peter Mortensen
4

Saya menggunakan regex untuk memastikan bahwa saya hanya mengizinkan huruf, angka, dan spasi

Maka sesederhana menambahkan ruang ke apa yang sudah Anda miliki:

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

(catatan, saya menghapus s|yang tampaknya tidak disengaja? Tentu saja situ berlebihan; Anda dapat mengembalikannya |jika Anda membutuhkannya)

Jika Anda secara spesifik menginginkan * a * space, karena hanya dalam satu spasi, Anda akan memerlukan ekspresi yang lebih kompleks dari ini, dan mungkin ingin mempertimbangkan potongan logika non-regex yang terpisah.

Peter Boughton
sumber
3

Anda juga dapat menggunakan \ b untuk batas kata. Untuk nama saya akan menggunakan sesuatu seperti ini:

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

EDIT Memodifikasi ini menjadi regex dalam contoh Perl

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

EDIT LAGI Berdasarkan apa yang Anda inginkan:

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

Saya mencoba [[: space:]] dalam contoh di mana kelihatannya blogger di WordPress menggunakan karakter spasi non-standar. Sepertinya itu akan berhasil.

Jeremy Schultz
sumber
1

Gunakan seperti ini untuk memungkinkan ruang tunggal.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
Ajay Singh
sumber