Удаление пробелов в переменных ActionScript 2

скажем, у меня есть 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 любого материала форматирования. :)

Пробелы должны быть в XML, весь смысл XML состоит в том, чтобы отображать данные как есть, ваш код, переваривающий XML, может массировать текст по мере необходимости.

TravisO 26.12.2008 05:39

мм .. Я не уверен, что понимаю это.

andyk 29.12.2008 21:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
9 208
4

Ответы 4

Давненько я не возился с AS2.

someXML = new XML();
someXML.ignoreWhite = true;

если вы хотите str_replace попробуйте '\ n'

Неа. XML.ignoreWhite игнорирует пробелы между тегами; это не повлияет на пробелы внутри контейнера CDATA.

fenomas 26.12.2008 05:03

да, это как сказал феномас. И добавление \ n, похоже, тоже не имеет никакого эффекта.

andyk 29.12.2008 21:54

и, эээ, извините за поздний ответ глтовар.

andyk 29.12.2008 21:58

Несколько способов подойти к этому. Возможно, самый простой ответ: в каком-то смысле ваш 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? (Извините за поздний ответ на ваш ответ)

andyk 29.12.2008 21:57

Я только что обнаружил, что могу убрать вкладки, поставив <реальную вкладку> в качестве иглы для поиска. (не \ t) Теперь у меня осталась только новая строка. Я согласен с тем, что мне, вероятно, следует оставить материал для форматирования, но должен быть какой-то способ ... хм ...

andyk 29.12.2008 22:06

Да, «новая строка» - это предопределенная переменная в AS2. Я добавлю к ответу примечание о том, какой символ использовать для новой строки.

fenomas 30.12.2008 20:48

Я попробую использовать «новую строку» после праздников и потом сообщу об этом. С Новым Годом!

andyk 31.12.2008 16:35

быстрое обновление: новая строка работает, но ... (см. мой вопрос выше)

andyk 06.01.2009 10:12

Трудно догадаться, но пробовали ли вы удалить новую строку и \ n и \ r, как в моем примере? То есть используйте str_replace один за другим. Также имейте в виду, что такой подход будет означать, что ваш контент никогда не может содержать «настоящих» (то есть преднамеренных) разрывов строк.

fenomas 06.01.2009 14:37

извините за позднее обновление. Я пробовал использовать 4 str_replace, (для \ n, \ r, новой строки и реальной вкладки), \ n и \ r, похоже, не имеют никакого эффекта. Конечный результат такой же. (не может заменить последовательные символы новой строки). Я обновлю это до вопроса.

andyk 23.01.2009 06:36

Есть ли причина, по которой вы используете cdata? По общему признанию, я понятия не имею, что лучше всего подходит для этого, но я стараюсь не учитывать их и просто оставляю HTML внутри узла. var foo = node.childnodes.join("") отлично разбирает это, и я никогда не сталкивался с этими проблемами с пробелами.

всякий раз, когда вы хотите поместить HTML или что-то еще с большим количеством символов '<' или '>', лучше обернуть их внутри тега CDATA. В противном случае всего лишь небольшой фрагмент недействительного HTML сломал бы весь ваш XML.

andyk 06.01.2009 06:09

тем не менее, приятно знать это. Спасибо.

andyk 06.01.2009 06:13

Я читаю это снова и снова, и, если я правильно вас понимаю, все, что вам нужно знать, это убрать определенные символы (табуляции и новые строки) из строки в 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);

Другие вопросы по теме