удаление пробелов в переменных ActionScript 2 - PullRequest
2 голосов
/ 24 декабря 2008

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

mystring = str_replace(newline, '', mystring);

Но переводы строки удаляются только один раз, а это означает, что при каждом последующем переводе строки (например, перевод строки после другой строки) может быть удален только один перевод строки.

Теперь я не вижу в этом проблемы в функции str_replace, поскольку каждый последующий символ, кроме символа новой строки, просто удаляется.

Довольно сильно запутался в том, как подобные вещи обрабатываются в ActionScript. : -S

изменить 2:

Я пробовал str_replace - все, что я знаю, \ n, \ r, \ t, перевод строки и табуляция (нажатием клавиши табуляции). Замена \ n, \ r и \ t, похоже, никак не влияет.

Я знаю, что при успешном выполнении этого в моем контенте никогда не будет реальных разрывов строк. Это именно мое намерение. Я мог бы отформатировать XML так, как я хочу, без Flash, отображающего какие-либо вещи форматирования. :)

Ответы [ 4 ]

2 голосов
/ 26 декабря 2008

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

1 голос
/ 25 декабря 2008

прошло много времени с тех пор, как я возился с AS2.

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

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

0 голосов
/ 11 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...