Arada tire ile tüm kapaklar ile çizgileri maç için PHP regex

3 Cevap php

Ben belgenin biraz farklı bir stil uygulamak için varolan bir PHP düzenli ifade dönüştürmek için çalışıyorum.

İşte belgenin özgün tarzı var:

**FOODS - TYPE A** 
___________________________________ 
**PRODUCT** 
1) Mi Pueblito Queso Fresco Authentic Mexican Style Fresh Cheese; 
2) La Fe String Cheese 
**CODE** 
Sell by date going back to February 1, 2009 

Ve sadece çizgi yıldızlarla çevrili ise "true" döndürür ve depolar her tarafını başarıyla çalışan PHP Regex maç kodu "-" olarak $ m [1] ve $ m [2], sırasıyla.

 if ( preg_match('#^\*\*([^-]+)(?:-(.*))?\*\*$#', $line, $m) ) { 
    // only for **header - subheader** $m[2] is set. 
    if ( isset($m[2]) ) { 
      return array(TYPE_HEADER, array(trim($m[1]), trim($m[2]))); 
    } 
    else { 
      return array(TYPE_KEY, array($m[1])); 
    } 
  } 

So, for line 1: $m[1] = "FOODS" AND $m[2] = "TYPE A"; Line 2 would be skipped; Line 3: $m[1] = "PRODUCT", etc.

The question: başlıkları did not yıldızlarla varsa nasıl yukarıdaki regex maçı yeniden yazmak istiyorum, ama hala en az 4 karakter uzunluğunda tüm kapaklar, ve oldu? Örneğin:

FOODS - TYPE A 
___________________________________ 
PRODUCT
1) Mi Pueblito Queso Fresco Authentic Mexican Style Fresh Cheese; 
2) La Fe String Cheese 
CODE
Sell by date going back to February 1, 2009 

Teşekkür ederim.

3 Cevap

(Unicode regexes için "u" bayrağını unutma) çizgisinde:

^(?:\*\*)?(?=[^*]{4,})(\p{Lu}+)(?:\s*-\s*(\p{Lu}+))?(?:\*\*)?\s*$
^               # start of line
(?:\*\*)?       # two stars, optional
(?=[^*]{4,})    # followed by at least 4 non-star characters
(\p{Lu}+)       # group 1, Unicode upper case letters
(?:             # start no capture group
  \s*-\s*       #   space*, dash, space*
  (\p{Lu}+)     #   group 2, Inicode upper case letters
)?              # end no capture group, make optional
(?:\*\*)?       # two stars, optional
\s*             # optional trailing spaces
$               # end of line

EDIT: Yorumlar başı olarak, Basitleştirilmiş:

^(?=[A-Z ]{4,})([A-Z ]+)(?:-([A-Z ]+))?\s*$
^               # start of line
(?=[A-Z -]{4,}) # followed by at least 4 upper case characters, spaces or dashes
([A-Z ]+)       # group 1, upper case letters or space
(?:             # start no capture group
  -             #   a dash
  ([A-Z ]+)     #   group 2, upper case letters or space
)?              # end no capture group, make optional
\s*             # optional trailing spaces
$               # end of line

Grup 1 ve 2'nin içeriği kullanılmadan önce kesilmiş olmalıdır.

Düzenli ifade:

^(?=.{4})([^-]+)(?:-(.*))?$

Açıklama:

^          # start of line
(?=.{4})   # look ahead to make sure there are at least 4 characters
([^-]+)    # get all characters until it finds a dash character, if there is any
(?:-(.*))? # optional: skip the dash and continue get all characters until EOL
$          # end of line

Ben en az 4 karakter olan hatlarda sadece baktılar üstlendi.

Bu basit bir ifade açar beri regex değil, sadece İngilizce büyük harf karakteri maç olacak böylece Ayrıca, ben biraz aldattı. Eğer sadece büyük harf kabul emin olmak istiyorsanız neyse,, bunu yapmak gerekir:

^(?=.{4})([A-Z\s]+)(?:-([A-Z\s]+))?$

Yani bilmeniz gereken tüm başlık, dört büyük ASCII harf ile başlar ki? Bu çalışması gerekir:

'#^([A-Z]{4}[^-]*)(?:-(.*))?$#'