Normal ifade ile bir boşluk eşleme


229

Bir PHP normal ifadesinde bir boşluk karakteri eşleşmesi gerekiyor. Kimsenin fikri yok mu?

Yani iki kelime arasındaki boşluk "gavin schulz" gibi. Yalnızca harflere, sayılara ve boşluklara izin verdiğimden emin olmak için normal bir ifade kullanıyorum. Ama alanı nasıl bulacağımdan emin değilim. Şu anda sahip olduğum şey bu:

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

2
Hmm ... 'a' veya 'b' ile eşleştirme hakkında da soru yok ...;)

Yanıtlar:


368

Bir yer arıyorsanız, bu " "(bir boşluk) olacaktır.

Bir veya daha fazlasını arıyorsanız, " *"(bu iki boşluk ve yıldız işareti) veya " +"(bir boşluk ve artı).

Eğer ortak aralık, kullanım arıyorsanız "[ X]"veya "[ X][ X]*"veya "[ X]+"nerede Xfiziksel sekme karakteridir (ve her tüm bu örneklerde tek bir boşlukla öncesinde).

Bunlar şimdiye kadar gördüğüm her * regex motorunda çalışacak (bazıları bir veya daha fazlasına bile sahip değil"+" karaktere sahip değil, ugh).

Daha modern regex motorlarından birini kullanacağınızı biliyorsanız "\s"ve varyasyonları gitmenin yoludur. Ayrıca, kelime sınırlarının satır başlangıcı ve bitişiyle de eşleştiğine inanıyorum, boşluk bırakmadan veya izlemeden görünebilecek sözcükleri ararken önemlidir.

Özellikle PHP için bu sayfa yardımcı olabilir.

Düzenlemenizden, geçerli olmayan tüm karakterleri kaldırmak istediğiniz anlaşılıyor Bunun başlangıcı (normal ifadenin içindeki boşluğa dikkat edin):

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

Ayrıca, hileli her bir kelime arasında sadece bir boşluk olmasını ve başında veya sonunda hiçbir boşluk olmamasını istiyorsanız, bu biraz daha karmaşık (ve muhtemelen başka bir soru), ancak temel fikir şu olurdu:

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

Orijinal regex'i "" karakterinin yerini almak istiyor gibiydi. Alanı reddediyorsunuz, bu nedenle alanı amaçlandığı gibi "silinmeyecek".
Suroot

Alıntı: "sadece harflere, sayılara ve boşluklara izin ver", Gavin'in orijinal RE'si yanlıştı (bu yüzden soruyu soruyordu). Benim RE onlardan biri olmayan her şeyi siler.
paxdiablo

Boşluğun neden ortada olmak yerine eşleşme düzeninin sonunda olması gerekiyor?
warren

1
@ warren, öyle değil. 'Buradaki alan' yorumu, alanın nereye gittiğini değil, orada bir alan olduğunu (okuyucunun farkına varmaması durumunda) belirtiyordu.
paxdiablo

@Mike, hayır, durum böyle değil. Burada amaç , kümede olmayan tüm karakterleri değiştirmektir A-Za-z.... Köşeli parantez içindeki şapka bunu belirler. Köşeli parantez dışında şapka Hareketli eşleşen karakter anlamını değiştirir içinde dize başlangıcında seti.
paxdiablo


34

İşte normal ifadelerle boşluk hakkında bilmeniz gereken her şey:

  • [[:blank:]] Yalnızca boşluk veya sekme
  • [[:space:]] Beyaz boşluk
  • \s Herhangi bir boşluk karakteri
  • \v Dikey boşluk
  • \h Yatay boşluk
  • x Boşluğu yoksay

5

Bana öyle geliyor ki bu durumda REGEX kullanmak aşırıya kaçabilir. Neden sadece uzay karakterini bulmak için strpos değil . Ayrıca, normal ifadelerde boşluk karakteri hakkında özel bir şey yoktur, onu başka bir karakteri arayacağınız gibi arayabilirsiniz. Yani, desen boşluğunu devre dışı bırakmadıysanız, bu durumda zar zor gerekli değildir.


5

Perl'de anahtar \s(boşluk).


16
Bu yanlıştır - sadece boşluk karakterini değil, tüm boşlukları toplar.
J. Taylor

Ancak soru Perl ile değil PHP ile etiketlenmiştir.
Peter Mortensen

4

Yalnızca harflere, sayılara ve boşluklara izin verdiğimden emin olmak için normal ifade kullanıyorum

O zaman zaten sahip olduklarınıza bir alan eklemek kadar basit:

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

(not, s|kasıtsız görünen kaldırıldı ? Kesinlikle sgereksizdi; geri yükleyebilirsiniz| ihtiyacınız varsa )

Özellikle istiyorsanız * a * uzay olduğu gibi sadece tek bir birine, bu daha karmaşık bir ifadeyi gerekir ve mantık ayrı olmayan regex parça düşünebilirsiniz.


3

\ B kelimesini kelime sınırı için de kullanabilirsiniz. Adı için ben böyle bir şey kullanabilirsiniz:

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

EDIT Perl örneğinde bunu normal ifade olarak değiştirme

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

TEKRAR DÜZENLE İstediğinize göre:

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

1

WordPress blogcular standart olmayan boşluk karakterleri kullanıyor gibi görünüyor bir örnekte [[: space:]] deniyorum. İşe yarayacak gibi görünüyor.


1

Tek bir alana izin vermek için bu şekilde kullanın.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.