0

ファイル内の PHP コードのブロックを検索できる REGEX が必要です。例えば:

    <? print '<?xml version="1.0" encoding="UTF-8"?>';?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <?php echo "stuff"; ?>
    </head>
    <html>

REGEX によって解析されると、以下が返されます。

array(
    "<? print '<?xml version=\"1.0\" encoding="UTF-8"?>';?>",
    "<? echo \"stuff\"; ?>"
);

PHP が有効であると想定できます。

4

5 に答える 5

7

特定の PHP コードのPHP 言語トークンtoken_get_allのリストを取得します。次に、リストを反復処理し、開始タグ トークンと対応する終了タグを探すだけです。

$blocks = array();
$opened = false;
foreach (token_get_all($code) as $token) {
    if (!$opened) {
        if (is_array($token) && ($token[0] === T_OPEN_TAG || $token[0] === T_OPEN_TAG_WITH_ECHO)) {
            $opened = true;
            $buffer = $token[1];
        }
    } else {
        if (is_array($token)) {
            $buffer .= $token[1];
            if ($token[0] === T_CLOSE_TAG) {
                $opened = false;
                $blocks[] = $buffer;
            }
        } else {
            $buffer .= $token;
        }
    }
}
于 2010-07-02T14:59:08.430 に答える
2

これは、カスタム パーサーに適したタイプのタスクです。スタックを使用して比較的簡単に構築できます。正規表現をデバッグするよりもはるかに迅速に実行でき、抜け毛も少ないことを保証できます。

正規表現は適切に使用すれば優れたツールですが、すべてのテキスト解析タスクが同じというわけではありません。

于 2010-07-02T14:49:07.237 に答える
0

この正規表現を試してください(テストされていません):

preg_match_all('@<\?.*?\?>@si',$html,$m);
print_r($m[0]);
于 2010-07-02T14:54:22.030 に答える
0

を使用して次の正規表現を試してくださいpreg_match()

/<\?(?:php)?\s+(.*?)\?>/

それはテストされていませんが、スタートです。これは、PHP の終了タグ (おそらく整形式) を前提としています。

于 2010-07-02T14:48:40.467 に答える
0
<\?(?:php)?\s+.*?\?>$

次の修飾子を使用します。

ドットマッチ改行

^& 改行で一致

于 2010-07-02T14:56:28.330 に答える