Bir maç için normal ifadeleri kullanabilirsiniz?

3 Cevap php

Ben yakın zamana kadar bazı garip eski istemci şablonları ayrıştırmak için oldukça iyi işleyen olmuş bir PHP düzenli ifade var biz kaçan bir soru işareti (\?) Bir şablon ifadesi yer bulunca. Ben ileride olumsuz bir görünüm veya böylece bazı tekno-anlamsızlığından etrafında zayıf şehriye sarmak benim düzenli ifade-fu ile yeterince güçlü değilim, doğru yönde uçlarına ya da noktaları büyük mutluluk duyacağız.

Benim PHP:

preg_match_all("/\{\{IF (.*)\?(.*):(.*)\}\}/U", $template, $m, PREG_SET_ORDER);

Ben bu soruyu yayınlanmıştır Tamam, ben biraz bunalmış. Bana uygun bir bağlam içine koymak için izin verin.

Şablon kod şöyle görünür:

{{IF VAR?"SHOW: THIS?":"SHOW {{ELSE}}"}}

: Olarak çözümlenen hangi

if ($template[$var]) {
 echo "SHOW: THIS?";
} else {
 echo "SHOW ".$template['ELSE'];
}

Şu anda neredeyse benim fonksiyonu ile bu elde değil, tamamen duyuyorum. Bu fonksiyonu şudur:

preg_match_all("/\{\{IF ((?:[^\\?]|\\.)*)\?((?:[^\\:]|\\.)*):(.*)\}\}[^<\/]/", $template, $m, PREG_SET_ORDER);
if (count($m)) {
 foreach ($m as $o) {
  if (preg_match("/(.*)\s+(==|!=)\s+(.*)/", $o[1], $x)) {
   if (preg_match("/^\"(.*)\"/", $x[1], $cx)) $e1 = $cx[1];
   else $e1 = is_numeric($x[1])?$x[1]:$data[$x[1]];
   if (preg_match("/^\"(.*)\"/", $x[3], $cx)) $e2 = $cx[1];
   else $e2 = is_numeric($x[3])?$x[3]:$data[$x[3]];
   if (preg_match("/^\"(.*)\"/", $o[2], $ox)) $er[0] = $ox[1];
   else $er[0] =  addslashes(htmlspecialchars($data[$o[2]]));
   if (preg_match("/^\"(.*)\"/", $o[3], $ox)) $er[1] = $ox[1];
   else $er[1] = addslashes(htmlspecialchars($data[$o[3]]));
   $eval = "\$od = (\"$e1\" $x[2] \"$e2\")?\"$er[0]\":\"$er[1]\";";
   eval($eval);
  } else {
   $od = $data[$o[1]]?$o[2]:$o[3];
   if (preg_match("/^\"(.*)\"/", $od, $x)) $od = $x[1];
   else $od = $data[$od];
  }
  $template = str_replace($o[0], $od, $template);
 }
}

if (is_array($data))
 foreach ($data as $k => $v) $template = str_replace('{{'.$k.'}}', $v, $template);
return $template;

3 Cevap

Değiştirmek için gereken sizin (.*) semtler-bu şey bir dizi maç için istiyorum artık doğrudur. Bunun yerine, olmayan kaçan bir karakter dizisini maç ya da dizileri kaçmak istiyorum: ((?:[^\\]|\\.)*) Bu backslashed kaçar içeren herhangi bir dize maç olacak. Ben muhtemelen Eğer soru işaretleri ya da kolonların yapamazsın maç istemiyorum belirterek performansını artırmak düşünüyorum; Eğer bu olsaydı, sen regex ile bitirmek istiyorum /\{\{IF ((?:[^\\?]|\\.)*)\?((?:[^\\:]|\\.)*):(.*)\}\}/. Bu pis görünüyor olsa da, ben sadece yukarıdaki var yapımı ile (.*) s ikame ettik; oldukça basittir.

Neden olmasın

(.*)[^\\]\?(.*)

İşte çalıştı budur. Doğru yönde bir nokta için @ absz teşekkürler.

preg_match_all("/\{\{IF ([^\"\\]]*(\\.[^\"\\]]*)*)\?((?:[^\\:]|\\.)*):(.*)}\}/", $template, $m, PREG_SET_ORDER);