скажем, у меня есть XML-файл, содержащий это:
<description><![CDATA[
<h2>lorem ipsum</h2>
<p>some text</p>
]]></description>
который я хочу получить и проанализировать в ActionScript 2 как текст HTML, и установить некоторый CSS перед его отображением. Проблема в том, что Flash берет эти пробелы (перевод строки и табуляция) и отображает их как есть.
<some whitespace here>
lorem ipsum
some text
где результат, который я хочу, это
lorem ipsum
some text
Я знаю, что могу удалить пробелы прямо из XML-файла (Flash-разработчик на моем рабочем месте также предлагает это. Я думаю, он понятия не имеет, как это сделать [вздох]). Но, сделав это, будет трудно прочитать раздел в XML-файле, особенно когда задействовано много тегов, что затрудняет редактирование.
Итак, теперь я ищу способ убрать эти пробелы в ActionScript. Я пробовал использовать эквивалент PHP str_replace (получил его от здесь). Но что мне использовать в качестве иглы (строки для поиска)? (Я пытался вставить "\t" и "\r", похоже, не могу обнаружить эти пробелы).
редактировать :
теперь, когда я попытался вставить newline в качестве иглы, он работает (это означает, что новая строка успешно удалена).
mystring = str_replace(newline, '', mystring);
Но новые строки удалялись только один раз, что означает, что в каждом последовательном переводе строки (например, новая строка, за которой следует еще одна новая строка) может быть удалена только одна новая строка.
Теперь я не вижу в этом проблемы в функции str_replace, поскольку каждый последовательный символ, кроме новой строки, удаляется просто отлично.
Сильно запутался в том, как подобные вещи обрабатываются в ActionScript. : -s
редактировать 2:
Я пробовал str_replace -ing все, что я знаю, \ n, \ r, \ t, новую строку и табуляцию (нажав клавишу табуляции). Замена \ n, \ r и \ t, похоже, не имеет никакого эффекта.
Я знаю, что при успешном выполнении этого в моем контенте никогда не будет реальных разрывов строк. Это именно мое намерение. Я мог бы отформатировать XML так, как я хочу, без отображения Flash любого материала форматирования. :)
мм .. Я не уверен, что понимаю это.





Давненько я не возился с AS2.
someXML = new XML();
someXML.ignoreWhite = true;
если вы хотите str_replace попробуйте '\ n'
Неа. XML.ignoreWhite игнорирует пробелы между тегами; это не повлияет на пробелы внутри контейнера CDATA.
да, это как сказал феномас. И добавление \ n, похоже, тоже не имеет никакого эффекта.
и, эээ, извините за поздний ответ глтовар.
Несколько способов подойти к этому. Возможно, самый простой ответ: в каком-то смысле ваш Flash-разработчик, вероятно, прав, и вам следует переместить пробелы за пределы контейнера CDATA. Причина в том, что многие люди (по крайней мере, я) склонны считать, что все внутри CDATA - это «реальные данные», а не разметка. С другой стороны, пробел за пределами в CDATA обычно считается несущественным, поэтому такие данные:
<description>
<![CDATA[<h2>lorem ipsum</h2>
<p>some text</p>]]>
</description>
было бы легче понять и работать. (Разработчик флэш-памяти может использовать свойство XML.ignoreWhite, чтобы игнорировать пробелы вне CDATA.)
С учетом сказанного, если вы редактируете XML вручную, я понимаю, почему было бы проще использовать описанное вами форматирование. Однако, если лишние пробелы находятся внутри CDATA, они неизбежно будут включены в извлекаемые вами строковые данные, поэтому единственный вариант - захватить содержимое CDATA и впоследствии удалить пробелы.
Тогда ваш вопрос сводится к «как удалить начальные / конечные пробелы из строки в AS2?». И, к сожалению, поскольку AS2 не поддерживает RegEx, нет простого способа сделать это. Я думаю, что ваш лучший вариант - проанализировать с начала и до конца, чтобы найти первый / последний небелый символ. Что-то в этом роде (непроверенный псевдокод):
myString = stuffFromXML;
whitespace = " " + "\t" + "\n" + "\r" + newline;
start = 0;
end = myString.length;
while ( testString( myString.substr(start,1), whitespace ) ) { start++; }
while ( testString( myString.substr(end-1,1), whitespace ) ) { end--; }
trimmedString = myString.substring( start, end );
function testString( needle, haystack ) {
return ( haystack.indexOf( needle ) > -1 );
}
Надеюсь, это поможет!
Обновлено: я заметил, что в вашем примере вам также необходимо удалить вкладки и пробелы в из ваших текстовых данных. Это было бы сложно, если вы не можете гарантировать, что ваши данные никогда не будут включать «настоящие» вкладки в дополнение к вкладкам для форматирования. Независимо от того, что вы делаете с тегами CDATA, вероятно, было бы разумнее не вставлять постороннее форматирование в ваш реальный контент, а затем удалять его программно. Это просто усложняет вашу жизнь.
Второе редактирование: что касается того, какой символ удалить, чтобы избавиться от новой строки, это частично зависит от того, какие символы на самом деле находятся в XML для начала (что, вероятно, зависит от того, какая ОС работает, где создается файл), и частично от того, какой символ клиентская машина (которая показывает флэш) считает перевод строки. Множество кровавых подробностей здесь. Однако на практике, если вы удалите \r, \n и \r\n, это обычно помогает. Вот почему я добавил и \ r, и \ n в строку «пробела» в моем примере кода.
что такое newline? Это какие-то предопределенные переменные в AS2? (Извините за поздний ответ на ваш ответ)
Я только что обнаружил, что могу убрать вкладки, поставив <реальную вкладку> в качестве иглы для поиска. (не \ t) Теперь у меня осталась только новая строка. Я согласен с тем, что мне, вероятно, следует оставить материал для форматирования, но должен быть какой-то способ ... хм ...
Да, «новая строка» - это предопределенная переменная в AS2. Я добавлю к ответу примечание о том, какой символ использовать для новой строки.
Я попробую использовать «новую строку» после праздников и потом сообщу об этом. С Новым Годом!
быстрое обновление: новая строка работает, но ... (см. мой вопрос выше)
Трудно догадаться, но пробовали ли вы удалить новую строку и \ n и \ r, как в моем примере? То есть используйте str_replace один за другим. Также имейте в виду, что такой подход будет означать, что ваш контент никогда не может содержать «настоящих» (то есть преднамеренных) разрывов строк.
извините за позднее обновление. Я пробовал использовать 4 str_replace, (для \ n, \ r, новой строки и реальной вкладки), \ n и \ r, похоже, не имеют никакого эффекта. Конечный результат такой же. (не может заменить последовательные символы новой строки). Я обновлю это до вопроса.
Есть ли причина, по которой вы используете cdata? По общему признанию, я понятия не имею, что лучше всего подходит для этого, но я стараюсь не учитывать их и просто оставляю HTML внутри узла.
var foo = node.childnodes.join("") отлично разбирает это, и я никогда не сталкивался с этими проблемами с пробелами.
всякий раз, когда вы хотите поместить HTML или что-то еще с большим количеством символов '<' или '>', лучше обернуть их внутри тега CDATA. В противном случае всего лишь небольшой фрагмент недействительного HTML сломал бы весь ваш XML.
тем не менее, приятно знать это. Спасибо.
Я читаю это снова и снова, и, если я правильно вас понимаю, все, что вам нужно знать, это убрать определенные символы (табуляции и новые строки) из строки в AS2, верно? Не могу поверить, что никто еще не дал вам простой однострочный ответ:
myString = myString.split("\n").join("");Вот и все. Повторите это для \ r, \ n и \ t, и все символы новой строки и табуляции исчезнут. Если вы хотите, чтобы это была простая функция, сделайте следующее:
function stripWhiteSpace(str: String) : String
{
return str.split("\r").join("").split("\n").join("").split("\t").join("");
}Эта функция не изменит вашу старую строку, она вернет новую без \ r, \ n или \ t. Чтобы фактически изменить старую строку, используйте эту функцию следующим образом:
myString = stripWhiteSpace(myString);
Пробелы должны быть в XML, весь смысл XML состоит в том, чтобы отображать данные как есть, ваш код, переваривающий XML, может массировать текст по мере необходимости.