Выполнить скрипт оболочки в Ruby, передав HTML / PHP код в качестве аргумента - PullRequest
1 голос
/ 08 января 2020

У меня есть код HTML / PHP, который я передаю через функцию Ruby. Я хочу, чтобы он отображал минимизированный PHP, а не как есть. Я считаю, что команда оболочки php -w была бы идеальной для этого.

module Haml
  module Filters
    module PHP
      include Base
      ##
      # @param text, string (Haml/PHP code)
      #
      def render(text)

         `php -w <<< "<?php #{text} ?>"`

      end
    end
  end
end

Приведенный выше код ломается, потому что строка HTML / PHP text содержит специальные символы. Как лучше всего избежать их?


После публикации этого вопроса и благодаря комментариям я сделал больше проб и ошибок.

Я установил, что это вызвано только четырьмя специальными символами: " \ $ (backtick) (двойная кавычка, обратная сторона sh, знак доллара, обратная черта)

Я создал простое решение, которое работает (ниже) .

Ответы [ 3 ]

2 голосов
/ 08 января 2020

Передача содержимого в командной строке не просто рискованно, но и является неправильным способом сделать это в первую очередь. Используйте такие инструменты, как Open3 , чтобы сделать это путем прямой потоковой передачи , что исключает необходимость полного экранирования.

Подача ввода в файловый дескриптор STDIN вашего php -w процесс:

output = ''

Open3.popen2('php', '-w') do |stdin, stdout, wait_thr|
  stdin.write("<?php #{text} ?>")
  stdin.close
  output << stdout.read
end
1 голос
/ 08 января 2020

Вы смотрели на этот ответ: Ruby: экранирование спецсимволов в строке

это звучит так после прочтения файла, вам нужно удалить его символы.

file = File.open("users.txt")
file_data = file.read
clean_data = file_data.gsub(/\\/, '')

Затем распечатайте свои данные в команде оболочки (Вы можете сделать еще один выход)

0 голосов
/ 09 января 2020

Представленная ниже цепочка замещения, кажется, работает, но, как отмечают некоторые люди, возможно, лучшим решением будет использование shellescape .

# a breakdown of escaped characters

text.gsub("\\", "\\\\\\")  #   \ backslash (the escape character) 
text.gsub("\"", "\\\"")    #   " double quotation mark
text.gsub("$", "\\$")      #   $ dollar sign
text.gsub("`", "\\\\`")    #   ` backtick

Измененный код

module Haml
  module Filters
    module PHP
      include Base
      def render(text)

         text=text.gsub("\\", "\\\\\\").gsub("\"", "\\\"").gsub("$", "\\$").gsub("`", "\\\\`")

         `php -w <<< "<?php #{text} ?>"`

      end
    end
  end
end
...