PHP четыре уровня кавычек - PullRequest
0 голосов
/ 15 мая 2018

Есть ли какой-нибудь возможный способ иметь четыре уровня цитат?Или более эффективный способ печати javascript с использованием PHP?

Вот контекст, по которому мне нужны четыре уровня кавычек:

Первый уровень необходим для обтекания скрипта эхом.

<?php echo '<script></script>';

Второй уровень необходим для обтекания html для печати в java

<?php echo '<script>document.getElementByid("box").innerHTML = \'<button>test</button>\'</script>';

Третий уровень предназначен для обтекания функции onclick в кнопке

<?php echo '<script>document.getElementByid("box").innerHTML = \'<button onclick="some_function()">test</button>\'</script>';

Четвертый уровень - обернуть параметры в функции

<?php echo '<script>document.getElementByid("box").innerHTML = \'<button onclick="some_function(*insert quote*parameter*insert quote*)">test</button>\'</script>';

Редактировать 1: php должен отражать весь сценарий, потому что в некоторых сценариях должен существовать весь сценарий, а в других -не существует, например

<?php if($variable == "do_not_print"){// do nothing}else{//echo script}

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

цитата 1: '' цитата 2: "" цитата 3: \'\' цитата 4: \"\"

как это:

      <div id="root"></div>
      <?php
          echo '<script type="text/javascript">
          document.getElementById("root").innerHTML = "<button onclick=\"alert(\'its work\')\">test</button>\n";
      </script>';
      ?>
0 голосов
/ 15 мая 2018

Вы можете избежать проблем со строковыми кавычками, полностью исключив контекст PHP и используя

<?= ... ?>

для вставки значений на стороне сервера в вывод.

json_encode() также помогает санировать значения для безопасного использования в контексте JavaScript.

Я также рекомендую использовать библиотеку DOM для создания и вставки элементов

Например

if ($someThingOrOther) :
// end PHP context
?>
<script>
(() => { // IIFE to avoid polluting the global scope
  const someValueFromPhp = <?= json_encode($someValue) ?>
  const button = document.createElement('button')
  button.textContent = 'test'

  button.addEventListener('click', () => {
    some_function(someValueFromPhp)
  }, false)

  const box = document.getElementById('box')
  // empty out "box", faster than using "innerHTML"
  while(box.firstChild) {
    box.removeChild(box.firstChild)
  }
  box.appendChild(button)
})()
</script>
<?php
// and now back to PHP
else:
?>
<script>
// ...
</script>
<?php
endif;
...