2013-03-10 3 views
2

При написании простейшего прокси-сервера скрипта cgi оболочки, в котором выполняется перенос цитированного xml в обратном вызове в стиле jsonp, я столкнулся с проблемой с экранированием обратной косой черты (которая была решена путем проб и ошибок и превосходным отладчиком Opera). Я все еще пытаюсь понять, зачем нужен дополнительный набор обратных косых черт (8 против 4). Мне дано понять, что при каждом анализе вам нужно удвоить количество обратных косых черт, но либо я, кажется, где-то не вижу итерации, либо неправильно понимаю обработку. Разбирается ли он дважды в браузере?Зачем мне 8 обратных косых черт?

это последний рабочий код, который я пытаюсь выяснить, почему это работает

#!/bin/sh 
CB=${QUERY_STRING%%&*} 
URL=${QUERY_STRING#*&} 
case "$CB" in 
    callback=*) 
     printf "Content-type: application/javascript\r\n\r\n${CB##*=}(\"" 
     wget -q --no-check-certificate -U "NetSurf/2.9 (Linux; i686)" -T 20 -O - "$URL" \ 
      |tr -c [\ -~] " "|sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g" 
     printf "\")" 
     ;; 
    *)exit;; 
esac 

Вот тестовая страница, которую я использую (Edit - заменена более простой, не GZIP версии).

<html><head><title>test</title></head><body><div id="notaniframe"></div> 
<script> 
    function dummy(data){document.getElementById("notaniframe").innerHTML=data} 
    Loaded=0 
    setTimeout(function(){if(!Loaded)alert("load failed")},30000); 
</script> 
<script onload='Loaded=1' src="http://localhost/cgi-bin/xml2jsonp.cgi?callback=dummy&http://stackoverflow.com"></script> 
</body></html> 

Это просто переполняет stackoverflow.com в DIV

ответ

2

один проход выполняется с помощью Bash; эта команда:

sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g" 

работает этот sed скрипт:

s/[\]/\\\\/g;s/["]/\\"/g 

один проход выполняется по sed; в заменяющей строке, \\ означает \. Таким образом, этот сценарий sed заменит \ на \\ и " с \". Как хочешь. (Обратите внимание, что квадратные скобки " не делают ничего здесь, и квадратные скобки вокруг \ эквивалентны спасаясь его с другим \.)

Вы можете удалить один набор обратных косых черт, используя одинарные кавычки а не двойные кавычки в вашем сценарии Bash; внутри одиночных кавычек, \ не имеет особого значения. Другими словами, вы можете изменить это:

sed "s/[\\]/\\\\\\\\/g;s/[\"]/\\\\\"/g" 

к этому:

sed 's/[\]/\\\\/g;s/["]/\\"/g' 

или, если на то пошло, это:

sed 's/\\/\\\\/g;s/"/\\"/g' 
+0

'СЭД«s/[\]/\\\\/g; s/["]/\\"/g'' было именно тем, что мне не хватало, я не знаю, почему на этот раз я использовал двойные кавычки с sed. Благодарю. – technosaurus

+0

@technosaurus: Добро пожаловать! – ruakh

Смежные вопросы