2

で始まると確信しているテキスト ブロックがあるとし<?phpます。元のテキストから最初の php コード ブロックを抽出するにはどうすればよいでしょうか。

テキスト例:

<?php

echo "uh oh... \"; ?> in a \"; // string...  ?>";
echo 'uh oh... \\\'; ?> in a /* string ?> */...';

// ?> nope not done

/*

?> still not done

*/

echo "this should be echoed too";

?>

this is even more text...

PHPコア関数を使用する必要があると思いますtoken_get_allが、それを使用して元の文字列から削除するPHPブロックのサイズを取得する方法がわかりません。その関数は、PHP ブロックの最後に到達したことを明らかに認識しています。すべてのテキストを PHP に渡すことはできません。なぜなら、これは他の多くの処理層に深く関わっているからです。

そのため、最終結果には、これを含む PHP ブロックの末尾の外側に文字列が残るはずです: (前に空白がある場合)

this is even more text...

別の文字列で解析された PHP コード:

<?php

echo "uh oh... \"; ?> in a string...";
echo 'uh oh... \\\'; ?> in a string...';

// ?> nope not done

/*

?> still not done

*/

echo "this should be echoed too";

?>

派生クラスの内容リストを書き出す方法

私はリストを持っています

List <RootClass> classes = new List<RootClass>();

RootClass は、SubClass1 と SubClass2 という 2 つの他のクラスを派生させる抽象クラスです。プログラムでは、次の方法で新しいクラスを作成します。

classes.Add(new SubClass1(arg1, arg2));
classes.Add(new SubClass2(arg1, arg2));

クラス リストに 20 個の SubClass1 と 20 個の SubClass2 があるとします。たとえば、リスト内の SubClass1 のすべてのインスタンスのフィールドを書き出すにはどうすればよいですか?

私は試した:

foreach(SubClass1 sc1 in classes){
    Console.WriteLine(sc1.field1);
}

しかし、コンパイラは、タイプ SubClass1 か SubClass2 かに関係なく、リスト内の各オブジェクトをキャストしようとするようです。そのため、タイプ SubClass2 でそうしようとすると、キャスト例外がスローされます。

私もやった:

foreach (RootClass rc in classes){
if (rc is Subclass1){
    SubClass1 sc1 = rc as SubClass1;
    ConsoleWriteLine(sc1.field1);
}
}

後者のソリューションで問題なく動作します。問題は、私が書いているプログラムでは、これを何度も繰り返さなければならず、毎回異なるフィールドをさまざまな方法で変更する必要があるため、私の質問はこれを行うためのより深い方法があるかどうかです。 ?

4

1 に答える 1