تمرير سلسلة PHP إلى متغير JavaScript (والهروب من الأسطر الجديدة) [نسخة مكررة]

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

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

ما هي أسهل طريقة لترميز سلسلة PHP لإخراجها إلى متغير JavaScript؟

لدي سلسلة PHP تتضمن علامات الاقتباس والأسطر الجديدة.أحتاج إلى وضع محتويات هذه السلسلة في متغير JavaScript.

عادةً، أقوم بإنشاء JavaScript في ملف PHP، على النحو التالي:

<script>
  var myvar = "<?php echo $myVarValue;?>";
</script>

ومع ذلك، هذا لا يعمل عندما $myVarValue يحتوي على علامات الاقتباس أو الأسطر الجديدة.

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

المحلول

التوسع في إجابة شخص آخر:

<script>
  var myvar = <?php echo json_encode($myVarValue); ?>;
</script>

استخدام json_encode() يتطلب:

  • PHP 5.2.0 أو أكبر
  • $myVarValue مشفرة كـ UTF-8 (أو US-ASCII، بالطبع)

نظرًا لأن UTF-8 يدعم Unicode الكامل، فمن الآمن إجراء التحويل سريعًا.

لاحظ أنه بسبب json_encode يفلت من الخطوط المائلة للأمام، حتى لو كانت سلسلة تحتوي على </script> سيتم الهروب بأمان للطباعة باستخدام كتلة البرنامج النصي.

نصائح أخرى

قم بتشفيره باستخدام JSON

function escapeJavaScriptText($string)
{
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\")));
}

لقد واجهت مشكلة مماثلة وأدرك أن ما يلي هو الحل الأفضل:

<script>
    var myvar = decodeURIComponent("<?php echo rawurlencode($myVarValue); ?>");
</script>

ومع ذلك، وصلة يشير ما نشره ميكاهويتمان إلى وجود بعض الاختلافات الطفيفة في التشفير.PHP rawurlencode() من المفترض أن تمتثل الوظيفة آر إف سي 1738, ، في حين يبدو أنه لم يكن هناك مثل هذا الجهد مع جافا سكريبت decodeURIComponent().

النسخة بجنون العظمة: الهروب من كل شخصية.

function javascript_escape($str) {
  $new_str = '';

  $str_len = strlen($str);
  for($i = 0; $i < $str_len; $i++) {
    $new_str .= '\\x' . sprintf('%02x', ord(substr($str, $i, 1)));
  }

  return $new_str;
}

يحرر: السبب json_encode() قد لا يكون من المناسب أنه في بعض الأحيان، تحتاج إلى منع " ليتم إنشاؤها، على سبيل المثال.

<div onclick="alert(???)" />
<script>
var myVar = <?php echo json_encode($myVarValue); ?>;
</script>

أو

<script>
var myVar = <?= json_encode($myVarValue) ?>;
</script>

نجح حل Micah أدناه بالنسبة لي نظرًا لأن الموقع الذي كان علي تخصيصه لم يكن بتنسيق UTF-8، لذلك لم أتمكن من استخدام json؛سأصوت لصالحه لكن مندوبي ليس عاليًا بدرجة كافية.

function escapeJavaScriptText($string) 
{ 
    return str_replace("\n", '\n', str_replace('"', '\"', addcslashes(str_replace("\r", '', (string)$string), "\0..\37'\\"))); 
} 

يمكنك إدراجه في DIV مخفي، ثم تعيين HTML الداخلي لـ DIV لمتغير JavaScript الخاص بك.لا داعي للقلق بشأن الهروب من أي شيء.فقط تأكد من عدم وضع HTML معطل هناك.

بامكانك ان تحاول

<script type="text/javascript">
    myvar = unescape('<?=rawurlencode($myvar)?>');
</script>

لا تقم بتشغيله رغم ذلك addslashes();إذا كنت في سياق صفحة HTML، فلا يزال بإمكان محلل HTML رؤية </script> العلامة، حتى في منتصف السلسلة، وافترض أنها نهاية JavaScript:

<?php
    $value = 'XXX</script><script>alert(document.cookie);</script>';
?>

<script type="text/javascript">
    var foo = <?= json_encode($value) ?>; // Use this
    var foo = '<?= addslashes($value) ?>'; // Avoid, allows XSS!
</script>
  1. لا.استخدم اياكس، ضعه فيه data-* السمات الموجودة في HTML الخاص بك، أو أي شيء آخر ذي معنى.يؤدي استخدام البرامج النصية المضمنة إلى جعل صفحاتك أكبر، و قد تكون غير آمنة أو لا تزال تسمح للمستخدمين بإتلاف التخطيط, ، إلا إذا…

  2. … أنت تقوم بوظيفة أكثر أمانًا:

    function inline_json_encode($obj) {
        return str_replace('<!--', '<\!--', json_encode($obj));
    }
    

htmlspecialchars

وصف

string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )

هناك أحرف معينة لها أهمية خاصة في HTML، ويجب أن يتم تمثيلها بواسطة كيانات HTML إذا أرادت الحفاظ على معانيها.تقوم هذه الدالة بإرجاع سلسلة تحتوي على بعض هذه التحويلات؛الترجمات التي تم إجراؤها هي الأكثر فائدة لبرمجة الويب اليومية.إذا كنت تريد ترجمة كافة كيانات أحرف HTML، فاستخدم htmlentities() بدلاً من ذلك.

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

الترجمات التي تم تنفيذها هي:

* '&' (ampersand) becomes '&amp;'
* '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set.
* ''' (single quote) becomes '&#039;' only when ENT_QUOTES is set.
* '<' (less than) becomes '&lt;'
* '>' (greater than) becomes '&gt;'

http://ca.php.net/htmlspecialchars

لست متأكدًا مما إذا كانت هذه ممارسة سيئة أم لا، لكن أنا وفريقي نستخدم حلاً مختلطًا لـ html وJS وphp.نبدأ بسلسلة PHP التي نريد سحبها إلى متغير JS، فلنسميها:

$someString

بعد ذلك نستخدم عناصر النموذج المخفية في الصفحة، ونقوم بتعيين قيمتها كسلسلة:

<form id="pagePhpVars" method="post">
<input type="hidden" name="phpString1" id="phpString1" value="'.$someString.'" />
</form>

ثم إنها مسألة بسيطة تتمثل في تحديد متغير JS من خلال document.getElementById:

<script type="text/javascript" charset="UTF-8">
    var moonUnitAlpha = document.getElementById('phpString1').value;
</script>

يمكنك الآن استخدام متغير JS "moonUnitAlpha" في أي مكان تريد فيه الحصول على قيمة سلسلة PHP تلك.يبدو أن هذا يعمل بشكل جيد بالنسبة لنا.سنرى ما إذا كان سيصمد أمام الاستخدام المكثف.

إذا كنت تستخدم محرك قوالب لإنشاء HTML الخاص بك، فيمكنك ملؤه بما تريد!

الدفع XTemplates.إنه محرك قالب لطيف ومفتوح المصدر وخفيف الوزن.

سيبدو HTML/JS الخاص بك كما يلي:

<script>
    var myvar = {$MyVarValue};
</script>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top