أفضل طريقة لاستبدال المتغيرات في نص عادي باستخدام PHP

StackOverflow https://stackoverflow.com/questions/283222

  •  08-07-2019
  •  | 
  •  

سؤال

ما هي أفضل طريقة لأخذ بعض النص العادي (وليس رمز PHP) الذي يحتوي على متغيرات على غرار PHP ، ثم استبدال قيمة المتغير. من الصعب وصف هذا نوعًا ما ، لذا إليك مثال.

// -- myFile.txt --
Mary had a little $pet.

// -- parser.php --
$pet = "lamb";
// open myFile.txt and transform it such that...
$newContents = "Mary had a little lamb.";

لقد كنت أفكر في استخدام regex أو ربما eval(), ، على الرغم من أنني لست متأكدًا من أي شيء سيكون أسهل. سيتم تشغيل هذا البرنامج النصي محليًا فقط ، لذا فإن أي مخاوف بشأن مشكلات الأمان و eval() لا تنطبق (أعتقد؟).

سأضيف أيضًا أنه يمكنني الحصول على جميع المتغيرات اللازمة في صفيف باستخدام get_defined_vars():

$allVars = get_defined_vars();
echo $pet;             // "lamb"
echo $allVars['pet'];  // "lamb"
هل كانت مفيدة؟

المحلول

إذا كان من مصدر موثوق يمكنك استخدامه (وقفة دراماتيكية) eval () (يلهث الرعب من الجمهور).

$text = 'this is a $test'; // single quotes to simulate getting it from a file
$test = 'banana';
$text = eval('return "' . addslashes($text) . '";');
echo $text; // this is a banana

نصائح أخرى

سيكون Regex سهلاً بما فيه الكفاية. ولن يهتم بالأشياء التي eval() سوف تنظر في خطأ بناء الجملة.

إليك النمط للعثور على أسماء متغير نمط PHP.

\$\w+

من المحتمل أن آخذ هذا النمط العام وأستخدم صفيف PHP للبحث عن كل مباراة وجدتها (باستخدام (باستخدام (preg_replace_callback()). وبهذه الطريقة ، يجب تطبيق regex مرة واحدة فقط ، وهو أسرع على المدى الطويل.

$allVars = get_defined_vars();
$file = file_get_contents('myFile.txt');

// unsure if you have to use single or double backslashes here for PHP to understand
preg_replace_callback ('/\$(\w+)/', "find_replacements", $file);

// replace callback function
function find_replacements($match)
{
  global $allVars;
  if (array_key_exists($match[1], $allVars))
    return $allVars[$match[1]];
  else
    return $match[0];
}

إليك ما توصلت إليه للتو ، لكنني ما زلت مهتمًا بمعرفة ما إذا كانت هناك طريقة أفضل. هتافات.

$allVars = get_defined_vars();
$file = file_get_contents('myFile.txt');

foreach ($allVars as $var => $val) {
    $file = preg_replace("@\\$" . $var . "([^a-zA-Z_0-9\x7f-\xff]|$)@", $val . "\\1", $file);
}

هل يجب أن تكون حيوان أليف $؟ هل من الممكن ذلك <?= $pet ?> في حين أن؟ لأنه إذا كان الأمر كذلك ، فاستخدم فقط. هذه هي الفكرة الكاملة لـ PHP كمحرك templating.

//myFile.txt
Mary had a little <?= $pet ?>.

//parser.php

$pet = "lamb";
ob_start();
include("myFile.txt");
$contents = ob_end_clean();

echo $contents;

هذا سوف يتردد:

Mary had a little lamb.

حسب الموقف، str_replace قد تفعل الخدعة.

مثال:

// -- myFile.txt --
Mary had a little %pet%.

// -- parser.php --
$pet = "lamb";
$fileName = myFile.txt

$currentContents = file_get_contents($fileName);

$newContents = str_replace('%pet%', $pet, $currentContents);

// $newContents == 'Mary had a little lamb.'

عندما تنظر إلى str_replace لاحظ أن البحث واستبدال المعلمات يمكن أن يأخذ صفائف من القيم للبحث عنها واستبدالها.

يمكنك استخدام Strtr:

$text = file_get_contents('/path/to/myFile.txt'); // "Mary had a little $pet."
$allVars = get_defined_vars(); // array('pet' => 'lamb');
$translate = array();

foreach ($allVars as $key => $value) {
    $translate['$' . $key] = $value; // prepend '$' to vars to match text
}

// translate is now array('$pet' => 'lamb');

$text = strtr($text, $translate);

echo $text; // "Mary had a little lamb."

ربما ترغب في القيام بالوقوف المسبق في get_defined_vars () ، حتى لا تحلق المتغيرات مرتين. أو الأفضل من ذلك ، فقط تأكد من أن المفاتيح التي تقوم بتعيينها في البداية تطابق المعرف الذي تستخدمه في myfile.txt.

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