2012-05-26 10 views
5

Derzeit bin ich mit dieser:Regex alphanumerische Zeichen übereinstimmen, unterstreichen, Perioden und Strich, so dass Punkt-Strich nur in der Mitte

if (preg_match ('/^[a-zA-Z0-9_]+([a-zA-Z0-9_]*[.-]?[a-zA-Z0-9_]*)*[a-zA-Z0-9_]+$/', $product)) { 
return true; 
} else { 
return false 
} 

Zum Beispiel habe ich übereinstimmen soll:

  1. pro.duct-name_
  2. _pro.duct.name
  3. p.r.o.d_u_c_t.n-a-m-e

Aber ich will nicht entsprechen:

  1. pro..ductname
  2. .productname-
  3. -productname.
  4. -productname
+1

, was die Frage ist? –

+0

Bearbeitete die Beispiele, so dass es verständlicher ist. Braucht es eine weitere Erklärung? Bitte lassen Sie es mich wissen, ich würde gerne weiter klären. – banskt

+0

Warum sollte 'pro..ductname' nicht übereinstimmen? Die Punkte sind in der Mitte? –

Antwort

9

wäre die Antwort

/^[a-zA-Z0-9_]+([-.][a-zA-Z0-9_]+)*$/ 

sein, wenn nur Sie Strings .- und -. NICHT enthalten erlaubt übereinstimmen. Warum würden Sie ihnen erlauben, sich anzupassen? Aber wenn Sie wirklich diese Strings müssen auch übereinstimmen, ist eine mögliche Lösung ist

/^[a-zA-Z0-9_]+((\.(-\.)*-?|-(\.-)*\.?)[a-zA-Z0-9_]+)*$/ 

Die einzige . oder - der ersten Regex durch eine Sequenz ersetzt von . und - abwechselnd entweder mit . oder - starten, optional gefolgt von -. oder .- Paaren, jeweils gefolgt von bzw. ., um eine gerade Anzahl alternierender Zeichen zu ermöglichen. Diese Komplexität ist wahrscheinlich ein Überschwingen, scheint aber von den aktuellen Spezifikationen benötigt zu werden. Wenn ein Maximum von 2 abwechselnd . und - erforderlich ist, wird die Regex

/^[a-zA-Z0-9_]+((\.-?|-\.?)[a-zA-Z0-9_]+)*$/ 

-Test here oder here

+0

Der zweite funktioniert tatsächlich. Vielen Dank, obwohl ich zugeben muss, dass ich die Sequenz Ihrer zweiten Regex nicht vollständig verstehe. – banskt

+0

Ich habe die Antwort bearbeitet, um zu klären –

+0

Danke für die Erklärung. – banskt

3

Versuchen Sie, diese

(?im)^([a-z_][\w\.\-]+)(?![\.\-])\b 

UPDATE 1

(?im)^([a-z_](?:[\.\-]\w|\w)+(?![\.\-]))$ 

UPDATE 2

(?im)^([a-z_](?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+)$ 

Erläuterung

<!-- 
(?im)^([a-z_](?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+)$ 

Match the remainder of the regex with the options: case insensitive (i);^and $ match at line breaks (m) «(?im)» 
Assert position at the beginning of a line (at beginning of the string or after a line break character) «^» 
Match the regular expression below and capture its match into backreference number 1 «([a-z_](?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+)» 
    Match a single character present in the list below «[a-z_]» 
     A character in the range between “a” and “z” «a-z» 
     The character “_” «_» 
    Match the regular expression below «(?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
     Match either the regular expression below (attempting the next alternative only if this one fails) «\.\-\w» 
     Match the character “.” literally «\.» 
     Match the character “-” literally «\-» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
     Or match regular expression number 2 below (attempting the next alternative only if this one fails) «\-\.\w» 
     Match the character “-” literally «\-» 
     Match the character “.” literally «\.» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
     Or match regular expression number 3 below (attempting the next alternative only if this one fails) «\-\w» 
     Match the character “-” literally «\-» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
     Or match regular expression number 4 below (attempting the next alternative only if this one fails) «\.\w» 
     Match the character “.” literally «\.» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
     Or match regular expression number 5 below (the entire group fails if this one fails to match) «\w» 
     Match a single character that is a “word character” (letters, digits, and underscores) «\w» 
Assert position at the end of a line (at the end of the string or before a line break character) «$» 
--> 

Und Sie könnten es here testen.

+1

\ w ist nicht das gleiche wie [a-zA-Z0-9_] –

+0

der Test zeigt, dass es nicht funktioniert –

+0

Ich weiß nicht, ob das ist, was @Walter bezieht sich auf, aber ein wenig zu erarbeiten, [die PHP-Handbuch] (http://www.php.net/manual/en/regexp.reference.escape.php) sagt: _A "Wort" Zeichen ist ein beliebiger Buchstabe oder Ziffer oder der Unterstrich, das heißt, jedes Zeichen, das kann Teil eines Perl "Wortes" sein. Die Definition von Buchstaben und Ziffern wird von den Zeichentabellen von PCRE gesteuert und kann variieren, wenn ein lokalisierungsspezifischer Abgleich stattfindet. Im Gebietsschema "fr" (Französisch) werden beispielsweise einige Zeichen mit mehr als 128 Zeichen für Buchstaben mit Akzent verwendet, und diese werden von \ w._ – Herbert

0
/^[A-Z0-9_][A-Z0-9_.-]*[A-Z0-9_]$/i 

Dies stellt sicher, dass das erste und letzte Zeichen kein Strich oder Punkt ist; der Rest dazwischen kann aus einem beliebigen Zeichen bestehen (innerhalb des gewählten Sets).

0

Der unten stehende Regex wird nach einer Zeichenfolge suchen, die Zeichen, Zahlen, Bindestriche usw. und nur einen Punkt in der Mitte enthält.

/^[A-Za-z0-9_-]+(\.){1}[A-Za-z0-9_-]+$/i 

hoffe, das hilft

1

Dies tun sollten:

/^[A-z0-9_]([.-]?[A-Z0-9_]+)*[.-]?[A-z0-9_]$/ 

Es wird dafür sorgen, dass das Wort beginnt und endet mit alphanumerischen oder Unterstrich. Die Klammer in der Mitte stellt sicher, dass es höchstens einen Punkt oder Strich in Folge gibt, gefolgt von mindestens einem alphanumerischen oder Unterstrichzeichen.

Verwandte Themen