PHP register_printf_function

2 Cevap php

Ben kullanıcı vsprintf kullanan bir işlev için özel bir biçimi belirtmek izin gerekiyor, ve PHP glibc'mizin 'register_printf_function yok çünkü (), ben PCRE'nin ile yapmak gerekir.

Benim sorum ne sonradan programatik kullanım için kullanılabilir bir şekilde,% herhangi bir karakter tarafından takip ve ondan önce% olmaması maç için iyi regexp olurdu, değil mi?

Ben alabilir yakın çözüm oldu:

<?php

function myprintf($format,$args) {
 $matches = array();
 preg_match_all('/((?<!%)%*[^%]+)/', $format,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);
 print_r($matches);
}

myprintf("begin%a%%b%%%c%d",NULL);

Hangi tür işleri, AMA bu "%%% c" gibi girdilerin tarafından "karışık" olur. : Ben gibi bir gruplandırma (yani kaçtı) iki% işaretlerinin dizi var istiyorum

Array (
 0 => '%%',
 1 => '%c'
)

and not like it's doing it now: Array ( 0 => '%%%c' ) That is, I need to keep the input intact, though tokenized, in order to join the pieces together after I do the processing of the custom printf formats I encounter in the input.

Teşekkürler,

Flavius

PS: the "user" is actually another programmer. I am aware of the security implications.

2 Cevap

Kod:

$string = "begin%a%%b%%%c%d";
preg_match_all('/([^%]|%%)+|%.*?[a-zA-Z]/', $string, $matches);
print_r($matches[0]);

Çıktı:

Array
(
    [0] => begin
    [1] => %a
    [2] => %%b%%
    [3] => %c
    [4] => %d
)

Bu aynı zamanda, düzgün de %.3f veya %$1d gibi bileşik biçim belirteçleri ayrıştırmak gerekir.

Ne istediğiniz bir mektup veya başka bir% tarafından izlenen bir% ise, o zaman sadece yapabilirsiniz:

$string = "begin%a%%b%%%c%d";
preg_match_all("/%./", $string, $matches);
$values = $matches[0];

// $values = array(5) { [0]=> string(2) "%a" [1]=> string(2) "%%" [2]=> string(2) "%%" [3]=> string(2) "%c" [4]=> string(2) "%d" }

// begin %a %% b %% %c %d <- is the string with spaces.

Edit:

Ben bu aşağıdaki yorumlardan istediklerini eşdeğer olduğunu düşünüyorum:

preg_match_all('/(\s?\w+\s?|%[^%]|%%)/', $string, $matches);
$value = $matches[0];

// $value = array(7) { [0]=> string(5) "begin" [1]=> string(2) "%a" [2]=> string(2) "%%" [3]=> string(1) "b" [4]=> string(2) "%%" [5]=> string(2) "%c" [6]=> string(2) "%d" }

Temel fark [2]=> string(3) "%%b" %%, tek bir % zaten olarak değerlendirilebilir çünkü [2]=> string(2) "%%" [3]=> string(1) "b" bu da size aynı sonuçları vermelidir hale geliyor .