Forum Webscript.Ru

Программирование => Perl => Тема начата: от 01 Июля 2002, 05:22:14

Название: Проблемы с TEXTAREA продолжаются!
Отправлено: от 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; ©  
® < € " © ™


Асы, откликнитесь!
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: YA от 01 Июля 2002, 08:43:28
Цитировать
Вставляем из файла код перлового скрипта или HTML в текстареа
Вначале, определись, что ввводишь в форму: text/plain, text/html или что иное. Если не знаешь, формат данных в конкретном элементе формы, то это не лечится!
Если вводишь text/plain (как это чаще бывает), то перед тем, как вставлять этот текст в HTML, необходимо "спрятать" некоторые спец.символы:

sub text_plain($)
{
$_[0]=~s/&/&/g;
$_[0]=~s/"/"/g;
$_[0]=~s/$_[0]=~s/>/>/g;
$_[0]=~s/\\n/
\\n/g;
return $_[0];
}

Ну примерно так. Кавычки прятать не обязательно.

Цитировать
ему даже не нужно точку с запятой в конце ставить!
Почти всегда такие последовательности будут работать и без точки с запятой.

Так вот, основная мысль - всегда нужно знать формат данных, остальное - ерунда. В принципе, можно даже написать некий анализатор вводимых данных, чтобы формат определялся автоматически, но это уже извращение.
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: ESE от 01 Июля 2002, 15:58:55
Да, и я делал примерно так как YA говорит. А можешь & заменить на набор символов или слово amperand например а при сохранении обратно
1 $text=~s/\\&/amperand/g;


2 $text=~s/amperand/\\&/g;

ну это ты и сам описал в принципе.
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: YA от 01 Июля 2002, 17:59:23
Поправка. Должно быть так:
$_[0]=~s/&/&amp;/g;
$_[0]=~s/"/&quot;/g;

Кстати, в этом форуме ошибка - он не делает таких замен, вот и приходится по два раза писать одно и то же.

ESE, а что, если в тексте уже есть слово "amperand"? Не надо изобретаь велосипед, по крайней мере, неработающий велосипед. Все, что нужно для решения такой проблемы в HTML уже предусмотрено.
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: ESE от 03 Июля 2002, 01:24:16
2YA Полностью согласен :)
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: от 03 Июля 2002, 01:59:46
YA ,
а что это обозначает
$_[0]=~s/&/&/g;
$_[0]=~s/"/"/g;

меняем само на себя? - объясни, я с таким еще не сталкивался.

Цитировать
всегда нужно знать формат данных


А какой формат у перлового скрипта? Текст. Что с этого знания?

Почти всем.
Господа, Вы приводите примеры для HTML.
Да, на страницу так и надо выводить. Но я же спрашиваю совсем другое! Как выводить спецсимволы в TEXTAREA, чтоб они не интерпретировались? Чтоб, если написано & copy; (без паузы, естественно), чтоб так и в TEXTAREA выглядело. Чтоб скрипт был на себя похож. Ну какая мне радость делать замену
Цитировать
$_[0]=~s/&/&/g;
$_[0]=~s/"/"/g;

чтоб вместо & в программе писалось & amp; или какое-то слово? Мне нужно видеть реальный скрипт, вносить правки, и опять записывать это дело, исправленное, в файл скрипта.

Вот задача. Тут нужен спец по кодировкам, не столько даже по Perl...


"
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: от 03 Июля 2002, 02:10:09
А-а, я понял, это не само на себя, просто в этом форуме нет очистки спецсимолов, поэтому получается такое. У меня цитата такая же  получилась. А надо бы
Цитировать
$_[0]=~s/&/& amp;/g;
$_[0]=~s/"/& quot;/g;  

- я разнес тут на пробел, чтоб не интерпретировалось.

Ау, профи! Спасайся кто может!
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: YA от 04 Июля 2002, 02:36:43
Цитировать
меняем само на себя? - объясни, я с таким еще не сталкивался.
А если по внимательнее читать? Я уже объяснил (см. выше).
Цитировать
Тут нужен спец по кодировкам
Вот кодировки здесь совершенно не причем.
Цитировать
Ау, профи! Спасайся кто может!

Не понял, какие еще проблемы остались? Вроде, все разобрали. Чем тебя не устраивает предложенный вариант?
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: Kwazar от 04 Июля 2002, 10:29:12
Вы забыли еще один распостранненый вещь :)
Если в тексте закрыть тег текстареи - то она закроется, и ниже пойдет Html. Чем некоторые личнсти и пользуються, зарыв туда фва скрипт, выцепляющий ваши куки и пересылая их себе :(
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: YA от 04 Июля 2002, 18:02:06
Kwazar
А это на что:
Цитировать
$_[0]=~s/$_[0]=~s/>/>/g;

? Такая обработка не позволит закрыть тэг.
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: от 05 Июля 2002, 02:32:38
Забудьте Вы о регулярных выражениях  на минуточку. Речь идет не о том, чтобы спецсимволы , например < , поменять на его описание через &..., а прямо наоборот - если в коде уже стоит такое описание & lt;, и надо его таковым и сохранить, чтоб не превращалось в треугольный вид, т.е. чтоб не интерпретировалось при выводе в окно броузера.  Чтоб вместо буквы "с" в кружочке оставалось & copy; только без пробела и т.д. Вчитайтесь в то, что Вас спрашивают, а не рубите примитив сплеча.
Ну кто бы Вас тут на форуме спрашивал задачки для первого класса по Перлу, типа $_[0]=~s/
Я насчитал 108 спецсимволов, и теперь ясно, что при выборе имен для форм нужно проверять, чтобы они не совпадали с описанием спецсимволов. Потому как, если вы назовете кнопку, скажем, parametr, а потом используете это для вывода в HTML - ссылке, например, так:

 


, то можете получить нерабочую ссылку. Потому что & para; - это спецсимвол.  Мне в своем скрипте (> 2000 строк) пришлось поменять это имя parametr на par , поскольку решения задачи не найдено.

Вами, похоже, тоже.
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: от 05 Июля 2002, 02:35:05
Ну вот видите - и здесь такая же лажа вылезла!!! А ссылка была такой - , только без пробела.
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: ESE от 05 Июля 2002, 04:13:38
Ну что значит вылезла??? Посмотри HTML! Там исходник в чистом виде (ну а то что броузер вытворяет оно так и будет).
Идем в начало
Цитировать
Вначале, определись, что ввводишь в форму: text/plain, text/html или что иное. Если не знаешь, формат данных в конкретном элементе формы, то это не лечится!
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: YA от 05 Июля 2002, 08:09:27
Цитировать
Чтоб вместо буквы "с" в кружочке оставалось & copy; только без пробела и т.д. Вчитайтесь в то, что Вас спрашивают, а не рубите примитив сплеча.

:) Вчитывался уже не раз... У меня остается всегда в виде &copy; - заметь, что пробела нет! И мне для этого достаточно только ...=~s/&/&amp;/g;. Вот попробуй теперь объяснить, в каких случаях это у тебя не работает.

PS Ты бы зарегистрировался что-ли...
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: от 06 Июля 2002, 03:04:30
Цитировать
Вот попробуй теперь объяснить, в каких случаях это у тебя не работает.


Попробую.
Берем простой Перл файл. Мы его хотим загрузить в броузер с HTML, чтоб код выглядел, как в оригинале. Ясно, что приходится чистить:

open(FILE,"$file.pl")
@strings=;
close (FILE);

foreach (@strings) {  
s/&/& amp;/g;
s/\\s/\\>/& gt;/g;
s/\\n/
\\n/gi;
}

print @strings;

Все прекрасно, чиститься. Кроме случаев, если попадается в исходнике такой спецсимвол, как &copy;.  
Кстати, > (& gt;)  - тоже считается спецсимволом, но с ним нет проблем. Спецсимвол спецсимволу - рознь.
Еще такие же - & reg; или & para; или & quot;

Для & amp;copy;  замена s/&/& amp;/g; не поможет. Все равно будет кружок.

Вы говорите, что чтобы &copy;  выглядело без пробела, достаточно замены ...=~s/&/& amp;/g;. Но где Вы ее используете, что-то я не пойму. Вы ведь просто сюда в форму вставили & amp;copy;  Это же совсем другое!

Попробуйте таким образом, как я написал, любой файл вывести на экран, в котором есть &copy;  в любом месте текста - и посмотрите, что получится.

Цитировать
Ты бы зарегистрировался что-ли...

А зачем?
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: Oak от 06 Июля 2002, 03:26:50
Мда... Народ не знает что такое HTML.
Не знает, что HTML это не ASCII - это разные кодировки.
 И в общем случае низя ASCII файл вставить в HTML.

Вы бы уже и про подсветку Perl скрипта рассказали
типа

$gg=aa(5+"15");
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: YA от 06 Июля 2002, 12:30:46
Цитировать
Это же совсем другое!
Вот только теперь понял, о каком "другом" ты говоришь. Только не понял, зачем тебе это нужно:
Цитировать
Чтоб вместо буквы "с" в кружочке оставалось & copy; только без пробела и т.д.
Впрочем, и здесь я не вижу особых проблем - просто сначала делай такую замену:
s/©/&amp;copy;/g;
В результате в HTML будет: &amp;copy;
а на странице броузер покажет: &copy;
Ты так хотел?

PS. А Oak. кстати, опять прав:
"И в общем случае низя ASCII файл вставить в HTML."

PS-2. В последнем фрагменте твоего кода модификатор "i" совершенно не нужен.
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: от 08 Июля 2002, 04:16:27
Цитировать
Ты так хотел?
- именно!  :)
>просто сначала делай такую замену:
s/©/& amp;copy;/g;

Да, и так 108 раз. Cтолько спецсимволов я насчитал. А может их как-то скопом объявить можно?
Цитировать
модификатор "i"
- ну это механически - спешу как всегда

>Только не понял, зачем тебе это нужно
Чтобы сайт на сервере своего заказчика можно было править дистанционно, не требуя у него каждый раз пароль FTP.


Цитировать
Мда... Народ не знает что такое HTML. Не знает, что HTML это не ASCII - это разные кодировки.
- Дерево, ну так объясни - на то он и форум. Кому нужны твои вздохи? Конструктивней. Ты же знаешь. Дай другим знать. Или жалко :)
Название: Проблемы с TEXTAREA продолжаются!
Отправлено: SteelRat от 07 Сентября 2002, 04:29:46
А слабо ХТМЛ не декодировать, а отображаемый текст натужиться и поменять в нём & на &amp; тогда &nbsp; будет &amp;nbsp;.

итд...

Не вижу никакой проблемы.