سؤال

أحتاج إلى قراءة سلسلة، والكشف عن {var}، ثم قم بإجراء file_get_contents ('var.php') بدلا من {var}. يمكن تسمية "فار" أي شيء أو مثل الاختبار أو شكل جهة الاتصال، وما إلى ذلك. لا أريد أن أعرف ما هو VAR - عدم القيام بشرط ترميز صلب، ولكن فقط رؤية علامة أبجدية كبيرة تحيط بها الأقواس المجعدة فقط قم بعمل ملف file_get_contents () لتحميله.

أعلم أنني بحاجة إلى استخدام preg_match و preg_replace، لكنني تعثر من خلال regexps على هذا.

كيف هذا مفيد؟ انها مفيدة في ربط وورد.

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

المحلول

يحتوي Orion أعلاه على الحل المناسب، لكن ليس من الضروري حقا استخدام وظيفة رد الاتصال في حالتك البسيطة.

على افتراض أن أسماء الملفات هي الواصلات AZ + يمكنك القيام بذلك في سطر واحد باستخدام علم PHP / E في Regex:

$str = preg_replace('/{([-A-Z]+)}/e', 'file_get_contents(\'$1.html\')', $str);

ستحل محل أي مثيل {var} مع محتويات var.html. يمكنك بادئة المسار في المصطلح الثاني إذا كنت بحاجة إلى تحديد دليل معين.

هناك مخاوف أمان غامضة نفسها كما هو موضح أعلاه، لكنني لا أستطيع التفكير في أي شيء محدد.

نصائح أخرى

ستحتاج إلى القيام بعدد من الأشياء. أنا أفترض أنك تستطيع القيام بهذه العمل للحصول على بيانات الصفحة التي تريدها في السلسلة في سلسلة.

  1. أولا، ستحتاج إلى تعبير منتظم لتتناسب بشكل صحيح. يجب أن يكون من السهل إلى حد ما مع شيء مثل /{\w+}/.

  2. بعد ذلك، ستحتاج إلى استخدام جميع الأعلام إلى Preg_Match للحصول على موقع الإزاحة في بيانات الصفحة. ستتيح لك هذه الإزاحة تقسيم السلسلة إلى المقام الأول والمطابقة وبعد أجزاء من المباراة.

  3. بمجرد أن يكون لديك الأجزاء الثلاثة، ستحتاج إلى تشغيل تضمينها، وتصلحها معا.

  4. رغوة الصابون تكرار شطف.

  5. توقف عند العثور على المزيد من المتغيرات.

هذا ليس فعالا بشكل رهيب، وربما هناك طرق أفضل. قد ترغب في التفكير في القيام ب Preg_Split بدلا من ذلك، انقسام /[{}]/. وبعد بغض النظر عن كيفية شريحة أنت تفترض أنه يمكنك الوثوق بالبيانات الواردة، وهذا سيؤدي إلى تبسيط العملية برمتها كثيرا. للقيام بذلك، سأضع الكود مثل ذلك:

  1. خذ المحتوى الخاص بك وتقسيمه مثل ذلك: $parts = preg_split('/[{}]/', $page_string);

  2. اكتب وظيفة متكررة على الأجزاء مع المعايير التالية:

    • توقف عند طول ALG هو <3
    • آخر، إرجاع مجموعة جديدة تتكون من
    • ARG $ [0]. load_data (Arg $ [1]). ARG $ [2
    • بالإضافة إلى أي شيء يتم تركه في ARGV $ [3 ...
  3. قم بتشغيل وظيفتك عبر أجزاء $.

يمكنك أن تفعل ذلك دون ريجكس (لا سمح الله)، شيء مثل:

//return true if $str ends with $sub
function endsWith($str,$sub) {
    return ( substr( $str, strlen( $str ) - strlen( $sub ) ) === $sub );
}

$theStringWithVars = "blah.php cool.php awesome.php";
$sub = '.php';
$splitStr = split(" ", $theStringWithVars);
for($i=0;$i<count($splitStr);$i++) {
    if(endsWith(trim($splitStr[$i]),$sub)) {
        //file_get_contents($splitStr[$i]) etc...
    }    
}

خارج الجزء العلوي من رأسي، تريد هذا:

// load the "template" file
$input = file_get_contents($template_file_name);

// define a callback. Each time the regex matches something, it will call this function.
// whatever this function returns will be inserted as the replacement
function replaceCallback($matches){
  // match zero will be the entire match - eg {FOO}. 
  // match 1 will be just the bits inside the curly braces because of the grouping parens in the regex - eg FOO
  // convert it to lowercase and append ".html", so you're loading foo.html

  // then return the contents of that file.
  // BEWARE. GIANT MASSIVE SECURITY HOLES ABOUND. DO NOT DO THIS
  return file_get_contents( strtolower($matches[1]) . ".html" );
};
// run the actual replace method giving it our pattern, the callback, and the input file contents
$output = preg_replace_callback("\{([-A-Z]+)\}", replaceCallback, $input);

// todo: print the output

الآن سوف أشرح Regex

 \{([-A-Z]+)\}
  • ال \{ و \} فقط أخبرها لتتناسب مع الأقواس المجعد. أنت بحاجة إلى القطابق، كما { و } هي شخصيات خاصة، لذلك يحتاجون إلى الهروب.
  • ال ( و ) إنشاء مجموعة. أساسا هذا يتيح لك استخراج أجزاء معينة من المباراة. أستخدمه في الوظيفة أعلاه فقط لمطابقة الأشياء داخل الأقواس، دون مطابقة الأقواس أنفسهم. إذا لم أفعل هذا، فسأحتاج إلى تجريد { و } خارج المباراة، والتي ستكون مزعجة
  • ال [-A-Z] يقول "تطابق أي حرف كبير، أو -
  • ال + بعد [-A-Z] يعني أننا بحاجة إلى الحصول على حرف واحد على الأقل، ولكن يمكننا الحصول على أي رقم.

التحدث نسبيا، تعبير منتظم باهظ الثمن. بينما قد تحتاج إليها لمعرفة الملفات التي يتم تحميلها، فإنك بالتأكيد لا تحتاج إليها في إجراء الاستبدال، وربما يجب ألا تستخدم تعبيرات منتظمة. بعد كل شيء، أنت تعرف بالضبط ما تحل محله فلماذا تحتاج إلى بحث غامض؟

استخدم صفيفا مشتركا و Str_Reprace للقيام بدائلك. STR_REPLE يدعم المصفوفات اللازمة للقيام بدائل متعددة في وقت واحد. استبدال خط واحد، لا حلقات.

علي سبيل المثال:

$ بدائل = صفيف ('{var}' => file_get_contents ('var.php')، '{test}' => file_get_contents ('test.php')، ...)؛ $ Outputcontents = str_replace (array_keys (array_keys (user complitions)، us $ companitions، خرج $)؛
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top