Regex ile giriş alanından sprintf biçimi doğrulamak

3 Cevap php

Ben normal bir metin ve sprintf etiketleri hem girilebilir bir giriş alanı var.

Örnek: some text here. %1$s done %2$d times

How do I validate the sprintf parts so its not possible them wrong like %$1s ? The text is utf-8 and as far as I know regex only match latin-1 characters.

www.regular-expressions.info sanmıyorum liste /u, her yerde bu dize unicode olduğunu anlatmak için kullanılır gelmez.

Sadece sprintf parçaları doğrulamak için regex uygulamak sonra bulundu % veya $ ve ya eğer bütün giriş alanı dize aramak için en iyi yolu nedir?

Ben regex olacağını düşünüyorum: /%\d\$(s|d|u|f)/u

3 Cevap

Bu ben ile sona ne olduğunu ve kendi çalışma.

// Always use server validation even if you have JS validation
if (!isset($_POST['input']) || empty($_POST['input'])) {
  // Do stuff
} else {
  $matches = explode(' ',$_POST['input']);
  $validInput = true;

  foreach ($matches as $m) {
    // Check if a slice contains %$[number] as it indicates a sprintf format
    if (preg_match('/[%\d\$]+/',$m) > 0) {
      // Match found. Now check if its a valid sprintf format
      if ($validInput === false || preg_match('/^%(?:\d+\$)?[dfsu]$/u',$m)===0) {   // no match found
        $validInput = false;
        break; // Invalid sprintf format found. Abort
      }
    }
  }

  if ($validInput === false) {
    // Do stuff when input is NOT valid
  }
}

Sizinle ve işaretleme emri olmadan hem de maçlar regex desen için bamya ederiz.

Edit: Ben onun unutulmuş / atlanırsa şey kontrol edilecek itibaren% ararken, yanlış olduğunu fark etti. Yukarıdaki yeni kodudur.

"$ ValidInput === false | |" son olarak if ifadesi ihmal, ama bütünlüğü için dahil edilebilir.

Ben aslında sprintf direktifleri ayrıştırmak Gumbo en regex kullanılan, ancak% 1.2f gibi bir şey ayrıştırmak çalışırken ben hemen bir sorun koştu. Ben geri PHP'nin sprintf kılavuzuna gidiş sona erdi ve onun kurallarına göre regex yazdı. Bugüne kadar ben bir regex uzmanı değilim, bu yüzden yazmak için temiz yoldur eğer ben emin değilim:

/%(?:\d+\$)?[+-]?(?:[ 0]|'.{1})?-?\d*(?:\.\d+)?[bcdeEufFgGosxX]/

I http://www.spaweditor.com/scripts/regex/index.php bunu test etmek için kullanılır, ve ben oldukça çok kopyalanan / sprintf kılavuzda kullanılan direktif örneklerin çoğu yapıştırılan ve beklendiği gibi ayrıştırır.