5

HTMLと混合したphpページがあります。いくつかのコード例:

<?php echo "<p>some text</p>"; ?>/* <? some php in comments ?> */
<p>some HTML text</p> <!-- <h1>some HTML in comments</h1> -->
<? $header_info = <<<END 
\$some="<?php @ob_start(); @session_set_save_handler(); ?>";
END; ?>
<h2>Some more HTML</h2>

PHP タグと HTML タグごとに分割したいのですが、PHP タグまたは HTML タグは引用符またはコメントでそのままにしておきます。これは私がこれまでに持っているものです:

$array = preg_split("/((^<\?php)|([^'|\"]<\?php)|([^'|\"]<\?)|([^'|\"]\?>)|(<\%)|(\%>))/i", $string, -1);

私が抱えている問題は、最後の $array で HTML の閉じ括弧 '>' の一部が欠落していることです。HTML の開始タグと終了タグはそのままにしておきたいと思います。時々私はで終わる

<p></p instead of <p></p> 

次のようになります。

[0] echo "<p>some text</p>";  
[1] <p>some HTML text</p> 
[2] $header_info = <<<END 
\$some="<?php @ob_start(); @session_set_save_handler(); ?>";
END; 
[3] <h2>Some more HTML</h2>

preg_split がコメントを区切り文字として認識せず、無視する限り、コメントは配列の一部である必要はありません。

また、特に eval() を使用する場合、一部の php タグが次のようになる可能性があることにも気付きました。

"?> <p>some HTML text</p> <?";

これは、正規表現の引用符がこれらのケースのいずれにも一致しないことを意味します。

Preg_match() の方が良いオプションかもしれませんが、確かではありません。

正規表現に関してはあまり独創的ではなく、この時点で立ち往生しているため、どんな助けも大歓迎です。

どうもありがとう :)

4

1 に答える 1

2

前文
正規表現の解決策が求められたため、次の解決策は正規表現に依存します。ただし、この特定のケースでは、PHP パーサーの方が適しています。

正規表現

#(?<!"|\')<\\?(?:php)?\\s+(.+?)\\?>(?!"|\')|/\*.+\*/|<!--.+-->#is

スクリプトレット

$subject = '<?php echo "<p>some text</p>"; ?>/* <? some php in comments ?> */
<p>some HTML text</p> <!-- <h1>some HTML in comments</h1> -->
<? $header_info = <<<END
\\$some="<?php @ob_start(); @session_set_save_handler(); ?>";
END; ?>
<h2>Some more HTML</h2>';

$returnValue = preg_replace('#(?<!"|\')<\\?(?:php)?\\s+(.+?)\\?>(?!"|\')|/\*.+\*/|<!--.+-->#is', '$1', $subject, -1);

var_dump(preg_split('#\\r?\\n#s', $returnValue));

結果

array(6) {
  [0]=>
  string(25) "echo "<p>some text</p>"; "
  [1]=>
  string(22) "<p>some HTML text</p> "
  [2]=>
  string(21) "$header_info = <<<END"
  [3]=>
  string(60) "\$some="<?php @ob_start(); @session_set_save_handler(); ?>";"
  [4]=>
  string(5) "END; "
  [5]=>
  string(23) "<h2>Some more HTML</h2>"
}

デモ
http://sandbox.onlinephpfunctions.com/code/017a51877b50f272f151feade7b59e142757481e

討論

1. # 
2. (?<!"|\')
3. <\\?(?:php)?\\s+
4. (.+?)
5. \\?>
6. (?!"|\')
7. |/\*.+\*/
8. |<!--.+-->
9. #is

1 行目 / のエスケープを回避できるので、この正規表現区切り文字を使用します
2 行目ここに正規表現のキーがあります。の後読みは、次の開始 PHP タグの前に一重引用符または二重引用符がないことを確認するために使用されます。
3 行目ここでは、php の開始タグとは何かを定義しています。ASP タグもサポートするために、この行を次のように変更できます。<\\?(?:php|%)?\\s+
4 行目 PHP コード シーケンスの開始を検出したので、この php コード シーケンスに含まれるすべての文字に一致します。9 行s目では、フラグを使用して、php コード シーケンスにも新しい行が必要であることを示していることに注意してください。
5 行目 php コード シーケンスの終了をマークします。
6行目前の一致した php タグの後に、否定先読みアサーションを含む一重引用符または二重引用符が続かないことを確認します。
7,8 行目php/HTML コメントが見つかった場合、それらは単純に無視されます。
9 行目 f 正規表現を終了します。

既知の問題点

  • で正規表現を実行した後$subject、行は改行 (オプションの改行が前にある) 区切り文字で単純に分割されます。
  • PHP の heredoc または newdoc 構文を処理するための努力は行われません。
  • この正規表現は、実際の PHP コードに対する防弾正規表現と見なされるべきではありません。PHP パーサーの方がはるかに適しています。
于 2012-12-03T16:31:39.663 に答える