Adları için regex

16 Cevap php

Sadece regex bir 'harikalar' keşfetmeye başlıyor. Benim denemeler hataları orantısız miktarda kusuyor çünkü deneme ve yanılma öğrenir birisi olmak, gerçekten mücadele ediyorum ... Benim deneyler Ereg kullanarak PHP vardır ().

Neyse. Şimdi aynı regex kullanarak için ayrı ayrı ilk ve son adları ile çalışır ancak. Şimdiye kadar var:

^[A-Z][a-zA-Z]+$  

Bir sermaye ile başlar ve geri kalanı için sadece harfler (sermaye veya değil) olan herhangi bir uzunlukta bir dize. Ama paramparça yerde hemen hemen her yerde oluşabilir özel durumlar ile uğraşıyor.

  • Hecelenmiş İsimleri (Worthington-Smythe'ın)
  • Apostophies ile İsimler (D'Angelo)
  • Spaces (Van der Humpton) ile İsimler - veya gerekli olmayabilir ortasında başkentleri bu aşamada yol benim ilgi ötesinde.
  • Ortak İsimler (Ben & Jerry)

Belki bir isim ben hiç düşünme olduğumu olabilir diğer bazı yolu var, ama ben bu kafamı alabilirsiniz eğer, ben buna ekleyebilirsiniz şüpheli. Ben bu durumlardan daha fazla bir isim gelir örnekleri olacaktır eminim.

Ama adının başında veya sonunda teknik olarak doğru olmak değil - Yani, alt satırda benim regex de bir boşluk, tire, ve işaretleri ve kesme kabul sahip olduğunu düşünüyorum.

16 Cevap

  • Hecelenmiş İsimleri (Worthington-Smythe'ın)

Bir ekleme - ikinci karakter sınıfa. Bunu yapmak için en kolay yolu, muhtemelen (a-z olduğu gibi) bir dizi modifiye edici olarak yorumlanmamalıdır, böylece başlangıcında eklemektir.

^[A-Z][-a-zA-Z]+$
  • Apostophies ile İsimler (D'Angelo)

Bunu yapmanın bir yolu, naif vererek, yukarıdaki gibi olacaktır:

^[A-Z][-'a-zA-Z]+$

Eğer dize içine kaçmak gerekebilir unutmayın! Lütfen örnek verilen bir 'iyi' bir yol, olabilir:

^[A-Z]'?[-a-zA-Z]+$

Ikinci konumda olası bir tek kesme sağlayacak.

  • Spaces (Van der Humpton) ile İsimler - veya gerekli olmayabilir ortasında başkentleri bu aşamada yol benim ilgi ötesinde.

Burada ben sadece yine bizim naif şekilde yapmak için cazip olurdu:

^[A-Z]'?[- a-zA-Z]+$

Bir potansiyel olarak daha iyi bir yolu olabilir:

^[A-Z]'?[- a-zA-Z]( [a-zA-Z])*$

Sonunda fazladan kelime arar Hangi. Eğer ekstra bir metin gövdesinde adları için çalışıyoruz, ama sonra tekrar, orijinal ya da iyi yapmış olsaydı, bu muhtemelen iyi bir fikir değildir.

  • Ortak İsimler (Ben & Jerry)

Bu noktada artık tek adları bakarak değil mi?

Gördüğünüz gibi Neyse, regexes çok hızlı büyüyen bir alışkanlığı var ...

Bu regex benim için mükemmel.

^([ \u00c0-\u01ffa-zA-Z'\-])+$

It) (preg_match kullanarak php ortamlarda çalışıyor, ama her yerde çalışmıyor.

Bu Jérémie O'Co-nor bu yüzden tüm DTM-8 adları maçları düşünmek eşleşir.

Ben temelde regex bunu yapamam diyerek cevapları ile kabul ederken, ben itirazlar (uluslararasilasti karakter) bazı UTF dizeleri ve \p{L} karakter sınıfı (karşılaşmalar kullanarak çözülebilir olduğunu işaret eder Bir unicode "mektup").

Ben gerçekten bir sürü orada bazı iyi öneriler burada zaten, ama düzenli ifadeler hakkında daha fazla bilgi için birkaç kaynak istiyorsanız, kontrol etmelisiniz, çünkü isimleri önemser bir regex eklemek zorunda değilsiniz:

Temelde, ben Paul ile katılıyorum ... Her zaman di Caprio, DeVil gibi özel durumlar, ya da bulacaksınız.

Remarks on your message: in PHP, ereg is generally seen as obsolete (slow, incomplete) in favor of preg (PCRE regexes).
And you should try some regex tester, like the powerful Regex Coach: they are great to test quickly REs against arbitrary strings.

Eğer gerçekten sorunu çözmek için gereken ve yukarıdaki cevapları ile memnun değilseniz, sadece ben gitmek vereceğim, isteyin.

Bu benim için çalıştı:

 +[a-z]{2,3} +[a-z]*|[\w'-]*

Bu regex doğru aşağıdaki gibi isimler maç olacak:

Jean-Claude Van Damme

nadine arroyo-rodriquez

wayne la pierre

beverly d'angelo

billy-Bob Thornton

tito puente

susan del rio

Bu olacak grup "van damme", "arroyo-rodriquez" "d'angelo", "billy-bob", vb gibi gibi tekil isimler "wayne".

Bu gruplandırılmış şeyler aslında geçerli bir ad olup olmadığını test unutmayın. Diğerleri dediğim gibi, bunun için bir sözlük gerekir. Ayrıca, grup numaraları olacak, böylece bir sorun var eğer regex değiştirmek isteyebilirsiniz.

Ben bir MapReduce uygulama için isimleri ayrıştırmak bu yazdı. Bütün istediğim anahtar-değer çifti nesil daha doğru yapmak için tek bir kelime bir araya del foo ve la bar ve billy-bobs gruplama, adı alanına kelimeleri ayıklamak oldu.

Ben ikinci tavsiyesi 'pes'. Eğer (..., örneğin sahip olanlar šđčćž veya Kiril alfabesi veya Çince karakterler) sayıları, tire, kesme işareti ve bu, [a-Za-z] gibi bir şey hala uluslararası isimleri yakalamak olmaz dikkate bile

Ama ... neden bile adlarını doğrulamak için çalışıyorsun? Ne hatalar yakalamak için çalışıyoruz? Eğer insanlar sizden daha iyi isimlerini yazmak için bilmiyor muyum? ;) Cidden, adlarını doğrulamak için çalışarak yapabileceğiniz tek şey, alışılmadık isimleri ile insanları rahatsız etmektir.

^[A-Z][a-zA-Z '&-]*[A-Za-z]$

Bir büyük harf sıfır ya da herhangi bir harf, boşluk, tire, ve işareti veya kesme fazla takip mektupta, ve bir harfle biten ile başlayan şeyi kabul edecektir.

Daha fazla ilgili "isim-algılama" ile ilgili şeyler için bu soruya bakın.

http://stackoverflow.com/questions/256729/regex-to-match-a-maximum-of-4-spaces

Temelde, bu bir sorun var, yasal bir isim dize oluşamaz varlığı etkili hiçbir karakter vardır.

Æ ß ve diğer benzeri olmayan-kesinlikle-ascii karakterler ü hala ä olmadan bir deyişle kendinizi sınırlayan iseniz.

Kendinize UTF32 karakter tablosunun bir kopyasını alın ve basit regex özledim ki orada kaç millions geçerli karakter biliyoruz.

Kullanıcı adı birden fazla noktayı eklemek için bu Regex kullanın:

^[a-zA-Z][a-zA-Z0-9_]*\.?[a-zA-Z0-9_\.]*$

Dize uzunluğu ayrı ayrı ayarlanabilir.

Hatta beklenmeyen veya nadir yerlerde - - kolayca harfler büyük veya küçük olup olmadığı tüm madde nötralize olabilir strtoupper() kullanarak tüm harflere dize dönüştürme ve daha sonra karşı kontrol ederek sizin regex.

/([\u00c0-\u01ffa-zA-Z'\-]+[ ]?[*]?[\u00c0-\u01ffa-zA-Z'\-]*)+/;

Bu deneyin. Ayrıca ^ kullanarak karakter ile başlamak için zorlamak, ve $ kullanarak karakter ile sonlandırabilirsiniz

Ben bu aynı sorunu içine koştu ve attılar diğerleri gibi, bu% 100 aptal kanıt ifadesi değil, ama bizim için çalışıyor.

/([\-'a-z]+\s?){2,4}/

Bu ilk ve / veya soyadı yanı sıra ilk ve son adları arasında bir boşluk kontrol ya da herhangi bir tire ve / veya kesme için kontrol edecektir. Son bölüm 2 ve 4 arasında adları için kontrol edecek küçük bir büyüdür. Eğer 5 ya da 6 isimleri olabilir uluslararası kullanıcıların bir sürü var eğilimindedir varsa, 5 ya da 6 olduğunu değiştirebilir ve sizin için çalışması gerekir.

Eğer boşluk eklerseniz, sonra "O Pazar günü pazara gittik" geçerli bir isim olurdu.

Ben bir regex ile bunu yapabileceğimi sanmıyorum, kolayca bir regex kullanarak metnin bir yığın gelen isimleri tespit edemez, onaylanmış isimler sözlüğü ihtiyacı ve buna göre arama olacaktır. Listede herhangi bir isim değil tespit olmaz.

Adını dosya yama parçası olabilir, çünkü ben, bu kullanmışlardır.

//http://support.microsoft.com/kb/177506
foreach(array('/','\\',':','*','?','<','>','|') as $char)
  if(strpos($name,$char)!==false)
      die("Not allowed char: '$char'");

Vazgeçmek. Aklınıza gelebilecek her kural bazı kültür veya diğer istisnaları vardır. Bu "kültür" yasal "37eet" isimlerini değiştirmek gibi meraklılarının bile.