Forum Webscript.Ru
Программирование => Perl => Тема начата: от 01 Июля 2002, 05:22:14
-
Проблемы с TEXTAREA продолжаются!
Вставляем из файла код перлового скрипта или HTML в текстареа - и что мы видим? Специальные символы, которые начинаются на & - интерпретируются. Например, вместо & nbsp; вставляется пробел, вместо & copy; вставляется кружок с буквой "с" внутри, вместо & euro; вставляется знак евро и т.д. Здесь я специально разнес на всякий случай, чтобы и здесь проблем этих не было.
Как отвадить TEXTAREA от этого, чтоб писало, как есть в файле?
А совершенно случайно обнаружилось еще хуже - & para; интерпретируется как знак "пи" вытянутый такой (не знаю, что это такое), так вот ему даже не нужно точку с запятой в конце ставить! У меня в коде ссылка была такая (без паузы после амперсанда), так когда это загрузить из файла (open (FILE,"f.pl") и т.д.), то в ссылке стоит уже знак "пи", или как его там, вместо & para, а дальше по тексту - metr=1">. И ссылка после записи обратно в файл естественно не работает.
Значит, если у Вас есть имя функции, начинающейся на para..., которая вызывается & para...; и Вы ее будете загружать в TEXTAREA, то уже ее не обнаружите, а после записи из TEXTAREA в файл скрипт потеряет работоспособность!
Пока что я придумал только разносить амперсанд на пробел перед загрузкой в TEXTAREA, а при записи из TEXTAREA опять склеивать. Неприятно, ведь код не так выглядит, как в файле. Может есть какой-то способ с этими спецсимволами в TEXTAREA бороться? Может, у них есть какое-то специальное объединяющее обозначение как группы символов типа \\x88..., \\xA0...?
® ™ & lt; € ¶ & quot; ©
® < € " © ™
Асы, откликнитесь!
-
Вставляем из файла код перлового скрипта или HTML в текстареа
Вначале, определись, что ввводишь в форму: text/plain, text/html или что иное. Если не знаешь, формат данных в конкретном элементе формы, то это не лечится!
Если вводишь text/plain (как это чаще бывает), то перед тем, как вставлять этот текст в HTML, необходимо "спрятать" некоторые спец.символы:
sub text_plain($)
{
$_[0]=~s/&/&/g;
$_[0]=~s/"/"/g;
$_[0]=~s/</g;
$_[0]=~s/>/>/g;
$_[0]=~s/\\n/
\\n/g;
return $_[0];
}
Ну примерно так. Кавычки прятать не обязательно.
ему даже не нужно точку с запятой в конце ставить!
Почти всегда такие последовательности будут работать и без точки с запятой.
Так вот, основная мысль - всегда нужно знать формат данных, остальное - ерунда. В принципе, можно даже написать некий анализатор вводимых данных, чтобы формат определялся автоматически, но это уже извращение.
-
Да, и я делал примерно так как YA говорит. А можешь & заменить на набор символов или слово amperand например а при сохранении обратно
1 $text=~s/\\&/amperand/g;
2 $text=~s/amperand/\\&/g;
ну это ты и сам описал в принципе.
-
Поправка. Должно быть так:
$_[0]=~s/&/&/g;
$_[0]=~s/"/"/g;
Кстати, в этом форуме ошибка - он не делает таких замен, вот и приходится по два раза писать одно и то же.
ESE, а что, если в тексте уже есть слово "amperand"? Не надо изобретаь велосипед, по крайней мере, неработающий велосипед. Все, что нужно для решения такой проблемы в HTML уже предусмотрено.
-
2YA Полностью согласен :)
-
YA ,
а что это обозначает
$_[0]=~s/&/&/g;
$_[0]=~s/"/"/g;
меняем само на себя? - объясни, я с таким еще не сталкивался.
всегда нужно знать формат данных
А какой формат у перлового скрипта? Текст. Что с этого знания?
Почти всем.
Господа, Вы приводите примеры для HTML.
Да, на страницу так и надо выводить. Но я же спрашиваю совсем другое! Как выводить спецсимволы в TEXTAREA, чтоб они не интерпретировались? Чтоб, если написано & copy; (без паузы, естественно), чтоб так и в TEXTAREA выглядело. Чтоб скрипт был на себя похож. Ну какая мне радость делать замену
$_[0]=~s/&/&/g;
$_[0]=~s/"/"/g;
чтоб вместо & в программе писалось & amp; или какое-то слово? Мне нужно видеть реальный скрипт, вносить правки, и опять записывать это дело, исправленное, в файл скрипта.
Вот задача. Тут нужен спец по кодировкам, не столько даже по Perl...
"
-
А-а, я понял, это не само на себя, просто в этом форуме нет очистки спецсимолов, поэтому получается такое. У меня цитата такая же получилась. А надо бы
$_[0]=~s/&/& amp;/g;
$_[0]=~s/"/& quot;/g;
- я разнес тут на пробел, чтоб не интерпретировалось.
Ау, профи! Спасайся кто может!
-
меняем само на себя? - объясни, я с таким еще не сталкивался.
А если по внимательнее читать? Я уже объяснил (см. выше).
Тут нужен спец по кодировкам
Вот кодировки здесь совершенно не причем.
Ау, профи! Спасайся кто может!
Не понял, какие еще проблемы остались? Вроде, все разобрали. Чем тебя не устраивает предложенный вариант?
-
Вы забыли еще один распостранненый вещь :)
Если в тексте закрыть тег текстареи - то она закроется, и ниже пойдет Html. Чем некоторые личнсти и пользуються, зарыв туда фва скрипт, выцепляющий ваши куки и пересылая их себе :(
-
Kwazar
А это на что:
$_[0]=~s/</g;
$_[0]=~s/>/>/g;
? Такая обработка не позволит закрыть тэг.
-
Забудьте Вы о регулярных выражениях на минуточку. Речь идет не о том, чтобы спецсимволы , например < , поменять на его описание через &..., а прямо наоборот - если в коде уже стоит такое описание & lt;, и надо его таковым и сохранить, чтоб не превращалось в треугольный вид, т.е. чтоб не интерпретировалось при выводе в окно броузера. Чтоб вместо буквы "с" в кружочке оставалось & copy; только без пробела и т.д. Вчитайтесь в то, что Вас спрашивают, а не рубите примитив сплеча.
Ну кто бы Вас тут на форуме спрашивал задачки для первого класса по Перлу, типа $_[0]=~s/</g;
Я насчитал 108 спецсимволов, и теперь ясно, что при выборе имен для форм нужно проверять, чтобы они не совпадали с описанием спецсимволов. Потому как, если вы назовете кнопку, скажем, parametr, а потом используете это для вывода в HTML - ссылке, например, так:
, то можете получить нерабочую ссылку. Потому что & para; - это спецсимвол. Мне в своем скрипте (> 2000 строк) пришлось поменять это имя parametr на par , поскольку решения задачи не найдено.
Вами, похоже, тоже.
-
Ну вот видите - и здесь такая же лажа вылезла!!! А ссылка была такой - , только без пробела.
-
Ну что значит вылезла??? Посмотри HTML! Там исходник в чистом виде (ну а то что броузер вытворяет оно так и будет).
Идем в начало Вначале, определись, что ввводишь в форму: text/plain, text/html или что иное. Если не знаешь, формат данных в конкретном элементе формы, то это не лечится!
-
Чтоб вместо буквы "с" в кружочке оставалось & copy; только без пробела и т.д. Вчитайтесь в то, что Вас спрашивают, а не рубите примитив сплеча.
:) Вчитывался уже не раз... У меня остается всегда в виде © - заметь, что пробела нет! И мне для этого достаточно только ...=~s/&/&/g;. Вот попробуй теперь объяснить, в каких случаях это у тебя не работает.
PS Ты бы зарегистрировался что-ли...
-
Вот попробуй теперь объяснить, в каких случаях это у тебя не работает.
Попробую.
Берем простой Перл файл. Мы его хотим загрузить в броузер с HTML, чтоб код выглядел, как в оригинале. Ясно, что приходится чистить:
open(FILE,"$file.pl")
@strings=;
close (FILE);
foreach (@strings) {
s/&/& amp;/g;
s/\\& lt;/g;
s/\\>/& gt;/g;
s/\\n/
\\n/gi;
}
print @strings;
Все прекрасно, чиститься. Кроме случаев, если попадается в исходнике такой спецсимвол, как ©.
Кстати, > (& gt;) - тоже считается спецсимволом, но с ним нет проблем. Спецсимвол спецсимволу - рознь.
Еще такие же - & reg; или & para; или & quot;
Для & amp;copy; замена s/&/& amp;/g; не поможет. Все равно будет кружок.
Вы говорите, что чтобы © выглядело без пробела, достаточно замены ...=~s/&/& amp;/g;. Но где Вы ее используете, что-то я не пойму. Вы ведь просто сюда в форму вставили & amp;copy; Это же совсем другое!
Попробуйте таким образом, как я написал, любой файл вывести на экран, в котором есть © в любом месте текста - и посмотрите, что получится.
Ты бы зарегистрировался что-ли...
А зачем?
-
Мда... Народ не знает что такое HTML.
Не знает, что HTML это не ASCII - это разные кодировки.
И в общем случае низя ASCII файл вставить в HTML.
Вы бы уже и про подсветку Perl скрипта рассказали
типа
$gg=aa(5+"15");
-
Это же совсем другое!
Вот только теперь понял, о каком "другом" ты говоришь. Только не понял, зачем тебе это нужно:Чтоб вместо буквы "с" в кружочке оставалось & copy; только без пробела и т.д.
Впрочем, и здесь я не вижу особых проблем - просто сначала делай такую замену:
s/©/&copy;/g;
В результате в HTML будет: &copy;
а на странице броузер покажет: ©
Ты так хотел?
PS. А Oak. кстати, опять прав:
"И в общем случае низя ASCII файл вставить в HTML."
PS-2. В последнем фрагменте твоего кода модификатор "i" совершенно не нужен.
-
Ты так хотел?
- именно! :)
>просто сначала делай такую замену:
s/©/& amp;copy;/g;
Да, и так 108 раз. Cтолько спецсимволов я насчитал. А может их как-то скопом объявить можно?
модификатор "i"
- ну это механически - спешу как всегда
>Только не понял, зачем тебе это нужно
Чтобы сайт на сервере своего заказчика можно было править дистанционно, не требуя у него каждый раз пароль FTP.
Мда... Народ не знает что такое HTML. Не знает, что HTML это не ASCII - это разные кодировки.
- Дерево, ну так объясни - на то он и форум. Кому нужны твои вздохи? Конструктивней. Ты же знаешь. Дай другим знать. Или жалко :)
-
А слабо ХТМЛ не декодировать, а отображаемый текст натужиться и поменять в нём & на & тогда будет &nbsp;.
итд...
Не вижу никакой проблемы.