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 でこれらの空白を削除する方法を探しています。str_replacePHPの同等のものを使用しようとしました(ここから入手しました)。しかし、針(検索する文字列)として何を使用すればよいですか?"\t"( andを入れようとしましたが"\r"、これらの空白を検出できないようです)。

編集 :

針として投げ込もうとしたnewlineので、動作します(改行が正常に削除されたことを意味します)。

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

ただし、改行は 1 回だけ削除されます。つまり、連続するすべての改行 (たとえば、改行の後に別の改行が続く) では、1 つの改行しか削除できません。

str_replace改行以外のすべての連続する文字がうまく取り除かれるため、これが関数の問題とは思われません。

このようなものが ActionScript でどのように処理されるかについて、かなり混乱しています。:-s

編集2:

私は str_replace を試しました-私が知っているすべてのもの、\n、\r、\t、改行、およびタブ(タブキーを押すことによって)を試しました。\n、\r、および \t を置き換えても、まったく効果がないようです。

これをうまく行うことで、コンテンツに実際の改行が含まれないことを私は知っています。それがまさに私の意図です。Flash が書式設定を表示することなく、思い通りに XML を書式設定できました。:)

4

4 に答える 4

2

これにアプローチするいくつかの方法。おそらく最も簡単な答えは、ある意味では 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 タグをどうするにせよ、実際のコンテンツ内に余分な書式を挿入せず、その後プログラムで削除する方がおそらく賢明でしょう。それはあなた自身の人生を難しくしているだけです。

2番目の編集:改行を取り除くためにどの文字を削除するかについては、最初にXMLに実際に含まれる文字に部分的に依存し(おそらく、ファイルが生成された場所で実行されているOSに依存します)、部分的にどの文字に依存しますクライアントマシン(フラッシュを表示している)は改行を考慮します。ここにたくさんの血まみれの詳細があります。ただし、実際には、\r\n、およびを削除すると\r\n、通常はうまくいきます。そのため、コード例の「空白」文字列に \r と \n の両方を追加しました。

于 2008-12-26T02:02:35.517 に答える
1

AS2をいじってからしばらく経ちました。

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

str_replaceが必要な場合は、'\n'を試してください

于 2008-12-24T22:54:29.890 に答える
0

私はこれを何度も読んでいます、そして私があなたを正しく解釈しているなら、あなたがしたいのは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);
于 2009-04-10T23:29:14.177 に答える
0

cdata を使用している理由はありますか? 確かに、この種のベスト プラクティスが何であるかはわかりませんが、それらを除外して、ノード内に HTML を配置するだけにする傾向があります。 var foo = node.childnodes.join("")それをうまく解析し、これらの空白の問題に遭遇したことはないようです。

于 2009-01-05T06:11:38.693 に答える