重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

こんにちは。

今現在、htmlから外部PHPに書かれた関数を呼び出してhtml自分自身を整形しようと試みています。整形はタブ、改行、コメントを削除です。

the_html.htmlファイルの中身
//////////////////////
<?php
include_once("the_php.php");
func('the_html.html');
?>
<html lang="ja">
<head>
</head>
<body>

aaあ<br><br>

bbb<br><br>

ccc<br><br>
<!--コメント-->
</body>
</html>
//////////////////////

func.phpファイルの中身
//////////////////////
<?php
function func($html){
$fp=fopen($html, 'r');
if($fp){print('無事オープンしました');}else{print('オープンに失敗しました');}
$count = 0;
if($fp){
if(flock($fp, LOCK_SH)){
while(!feof($fp)) {
$buffer=fgets($fp);
$buffer=preg_replace('/(\t|\r\n|\r|\n)/s', '', $buffer);//タブ・改行を削除
$buffer=preg_replace('/<!--[\s\S]*?-->/s', '', $buffer);//コメントを削除
print($buffer);
$count++;
}
flock($fp, LOCK_UN);
}else{
print('ファイルロックに失敗しました');
}
}
fclose($fp);
}
?>
//////////////////////

表示させたthe_html.htmlのソース
//////////////////////
無事オープンしました<?phpinclude_once("the_php.php");a('the_html.html');?><html lang="ja"><head></head><body>aaあ<br><br>bbb<br><br>ccc<br><br></body></html>
<html lang="ja">
<head>

</head>
<body>

aaあ<br><br>

bbb<br><br>

ccc<br><br>
<!--コメント-->
</body>
</html>
//////////////////////

まぁ当然のことながら?整形していない自分自身も表示されてしまいます。

こうならない方法はあるものでしょうか?御教示下さい。よろしくお願い致します。

質問者からの補足コメント

  • //////////////////////
    <?php
    include_once("the_php.php");
    func('the_html.html');
    ?>
    <?php
    /*
    <html lang="ja">
    <head>
    </head>
    <body>

    aaあ<br><br>

    bbb<br><br>

    ccc<br><br>
    <!--コメント-->
    </body>
    </html>
    */
    ?>
    //////////////////////
    上記のように、htmlファイルの中身を
    <?php
    /*
    ~~~
    */
    ?>
    と偽装的なPHP文にしてしかも中身をコメントアウトさせることによって出来ました。

    ただ、<body>タグ内に、例として
    <?php
    echo "私は日本人です。";
    ?>
    の用にPHPを記述すると表示が巧くいきません。この様な、ネスト?見たいなのは可能でしょうか?

      補足日時:2015/04/23 04:54
  • 関数funcの中で
    if(strstr($buffer, '<?php')){
    処理;
    }
    処理を色々と試してみてもダメでした…。方法、ありますか?それともPHPというサーバー側での処理の問題で無理でしょうか?

      補足日時:2015/04/23 05:00
  • 中間処理としてtemp.htmlを作りました。
    the_html.htmlにtemp.htmlを呼び出すyobidashi関数を入れました。ちなみにyobidashi関数はprint関数で1行ずつ読み込みしてます。
    //////////////////////the_html.html↓
    <?php
    include_once("the_php.php");
    func('the_html.html');yobidashi('temp.html');
    ?>
    <?php
    /*
    <html lang="ja">
    <head>
    </head>
    <body>
    <?php
    echo "私は日本人です。";
    ?>
    ~~~
    //////////////////////
    この様にしてみましたが結果は同じでした。どうすればいいでしょうか?

      補足日時:2015/04/23 06:52
  • 自分の希望としては、やはり本体html自身が外部PHPファイルを呼び出して、そこに書かれている処理によって自分を整形して表示することです。

    tempファイルは作りたくないです。それや自宅で処理したファイルのアップロードもしたくないです。
    管理が面倒なので1つのhtmlファイルに付き、存在するファイルはhtmlファイル1つ自身にしたいのです。

    可能ですか?

      補足日時:2015/04/23 07:30

A 回答 (3件)

>自分の希望としては、やはり本体html自身が外部PHPファイルを呼び出して、


>そこに書かれている処理によって自分を整形して表示することです。

まずは「the_html.html」つまり拡張しhtmlはphpを実行することができるよう
設定してあるんですか?
それができていないなら何をやっても無駄です。

で、できている前提で
>そこで1行ゲットできる関数がないのかと思いを巡らしています。
1行ゲットする意味がわかりません、1行ゲットしてもなんの解決にもならないし
1行ずつゲットしなくても解決できる内容ですよね?
変な話<!--から-->の間に改行がはいってたら即アウトですよね?

ほぼ繰り返しになりますが、以下ソース
//the_html.html
<?php
ob_start();
?>
<html lang="ja">
<head>
</head>
<body>
<!-- ここから -->
aaあ<br><br>
bbb<br><br>
<!-- ここまで改行するな -->
<!--コメント-->
</body>
</html>
<?php
$buffer=ob_get_contents();
ob_end_clean();
include_once "func.php";
?>

//func.php
<?PHP
$buffer=preg_replace('/(\t|\r\n|\r|\n)/s', '', $buffer);//タブ・改行を削除
$buffer=preg_replace('/<!--[\s\S]*?-->/s', '', $buffer);//コメントを削除
print $buffer;
?>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

htmlはphpを実行できる様にもちろんしてあります。おかげさまで出来る様になりました!ありがとうございました。

お礼日時:2015/04/28 11:42

全体をob_start~ob_end_cleanでくくってしまえば


途中に何がはいっていてもバッファリングされますよね?

また一部だけバッファしたいのであれば、そこだけくくって
処理すればいいんだし、なにが問題なのかよくわかりませn。

<?php
$test=2;
ob_start();
?>
test1
<?PHP if($test==2){ ?>
test2ok
<?php }else{ ?>
test2ng
<?php } ?>
test3
<?PHP if($test==4){ ?>
test4ok
<?php }else{ ?>
test4ng
<?php } ?>
test5
<?php
$buffer=ob_get_contents();
ob_end_clean();
print $buffer;
?>
test6
    • good
    • 0
この回答へのお礼

更なるご回答ありがとうございます。

詳しくやりたいこととしては、
the_html.htmlファイルの中身
//////////////////////
<?php
ob_start();
?>
<html lang="ja">
<head>
</head>
<body>
<!-- ここから -->
aaあ<br><br>
bbb<br><br>
<!-- ここまで改行するな -->
<!--コメント-->
</body>
</html>
<?php
$buffer=ob_get_contents();
ob_end_clean();
$buffer=preg_replace('/(\t|\r\n|\r|\n)/s', '', $buffer);//タブ・改行を削除
$buffer=preg_replace('/<!--[\s\S]*?-->/s', '', $buffer);//コメントを削除
print $buffer;
?>
//////////////////////

の時に、出力のソースとして下記になりたいのです。
//////////////////////
<html lang="ja"><head></head><body>
aaあ<br><br>
bbb<br><br>
</body></html>
//////////////////////

そこで
$buffer=preg_replace('/(\t|\r\n|\r|\n)/s', '', $buffer);//タブ・改行を削除
$buffer=preg_replace('/<!--[\s\S]*?-->/s', '', $buffer);//コメントを削除
print $buffer;

を外部PHPの関数呼び出しで処理しようとしているのですが、うまくいきません。そこで1行ゲットできる関数がないのかと思いを巡らしています。

お礼日時:2015/04/24 00:57

たんに出力をバッファリングして整形してから出力すればいいのでは?


こんな感じ?

<?php
ob_start();
//以下本文
?>
<html lang="ja">
<head>
</head>
<body>

aaあ<br><br>

bbb<br><br>

ccc<br><br>
<!--コメント-->
</body>
</html>
<?php
//本文ここまで
$buffer=ob_get_contents();
ob_end_clean();
//ここから
$buffer=preg_replace('/(\t|\r\n|\r|\n)/s', '', $buffer);//タブ・改行を削除
$buffer=preg_replace('/<!--[\s\S]*?-->/s', '', $buffer);//コメントを削除
print $buffer;
//ここまでは外部関数にしてもOK
    • good
    • 0
この回答へのお礼

詳しい説明付きのご回答ありがとうございます。

ご提示の方法で、私のサンプルにあげたhtmlはやることが出来ました。

ただ、更に新しくhtml内で

htmlの内容
///////////////
~~~
<body>
~~~

<!-- ここから -->
<?php ~~~ ?>
~~~
<?php else: ?>
~~~
<?php endif; ?>
<!-- ここまで改行するな -->

~~~
</body>
<?php
//本文ここまで
$buffer=ob_get_contents();
ob_end_clean();
func2($buffer);
?>
///////////////
として、外部phpのfunc2関数を呼び出して見ると、どうもob_get_contents関数はファイル全体を取得しているのですよね?ですのでphp内で「改行するな」というifを用いることが出来ませんでした。

fgetsみたいに1行ずつ取得する方法を御教示願えないでしょうか?

お礼日時:2015/04/23 21:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!