سؤال

أحتاج إلى السماح للمستخدم بتحديد تنسيق مخصص لوظيفة تستخدم VSPRINTF، وبما أن PHP لا يحتوي على Glibc 'Register_PrintF_Function ()، فسوف أضطر إلى القيام بذلك باستخدام PCRE.

سؤالي هو، ما سيكون أفضل regexp لمباراة٪ متبوعا بأي شخصية وعدم وجود٪ قبل ذلك، بطريقة صالحة للاستخدام البرنامجي بعد ذلك؟

أقرب محلول يمكن أن أحصل عليه هو:

<?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);

أي كيندا يعمل، ولكن هذا يحصل على "confused" عن طريق المدخلات مثل "٪٪٪ C". أرغب في الحصول على سلسلة من الإصبعين بنسبة 2٪ (أي، هربوا) في مجموعة واحدة، مثل:

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

وليس مثل القيام بذلك الآن: صفيف (0 => '٪٪٪ C') وهذا هو، أحتاج إلى الحفاظ على الإدخال سليم، على الرغم من التمييز، من أجل الانضمام إلى القطع معا بعد أن أفعل معالجة الطباعة المخصصة التنسيقات التي أواجهها في المدخلات.

شكرا،

فلافيوس

ملاحظة: "المستخدم" هو في الواقع مبرمج آخر. أنا على علم الآثار الأمنية.

هل كانت مفيدة؟

المحلول

رمز:

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

انتاج:

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

هذا يجب أن تحليل محدد تنسيق المركب مثل %.3f أو %$1d بشكل صحيح كذلك، أيضا.

نصائح أخرى

إذا كان ما تريده هو٪ متبوعا بحرف أو٪ آخر، فيمكنك ببساطة القيام:

$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. 

يحرر:

أعتقد أن هذا يعادل ما تريده من التعليقات أدناه:

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" }

الفرق الرئيسي هو ذلك [2]=> string(3) "%%b" يصبح [2]=> string(2) "%%" [3]=> string(1) "b" والتي ينبغي أن تعطيك نفس النتائج لأن %% سيتم تقييمها كواحد % على أي حال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top