2016-03-22 14 views
0

PHPのfile_get_contents()の出力をJavaScriptに渡して、その長さを計算したいとします。すべてOKですが、変数を渡すとJavaScriptがHTMLコードとして評価されるので、PHPのjson_encode()を使用して "正常"にする必要がありますが、JavaScriptの文字列の長さはPHPの文字列の長さとは異なります。 JSのJSON.parse()を使用しても、HTMLコードが解釈されるので役立たない。どのように私は同じ評価されたデータの長さを達成することができますか?PHPの `file_get_contents()`出力がJavaScriptに渡され、長さが計算されます

EDIT:基本的には、タグや特殊文字を含むページソース内のすべての文字をカウントする必要があります。私はPHPのstrlen($url_data)のようなJSで計算された同じ出力を持っている。

EDIT 2:$url_databin2hex()を実行した後、JSで再変換して長さを確認しました。それは信頼できるでしょうか?ここで

は、私がこれまでにやったことです:

<?php 

ini_set('display_erros', -1); 

$error = ''; 

if ($_SERVER['REQUEST_METHOD'] === 'POST') { 
    if (isset($_POST['urlinput']) && !filter_var($_POST['urlinput'], FILTER_VALIDATE_URL) === false) { 
     $url = filter_var($_POST['urlinput'], FILTER_SANITIZE_URL); 
     $url_data = @file_get_contents($url); 
     $js_url_data = json_encode($url_data); 
     //$url_src = htmlspecialchars($url, ENT_IGNORE); 
     $url_data_len = mb_strlen($url_data); 
     $url_src = strip_tags($url_data); 
     echo '<ul id="resultList">'; 
     echo "<li>The following page contains " . $url_data_len . " characters</li>"; 
     echo "<li>Page URL: " . $_POST['urlinput'] . "</li>"; 
     echo "<li>Page title: " . page_title($url_data) . "</li>"; 
     echo "<li>Protocol: " . parse_url($url, PHP_URL_SCHEME) . "</li>"; 
     echo "<li>Host: " . parse_url($url, PHP_URL_HOST) . "</li>"; 
     echo "</ul>"; 
     //var_dump($url_src); 
    } else { 
     $error = "URL is not valid!"; 
    } 

} 

function page_title($str) { 

    $matches = array(); 

    if (preg_match('/<title>(.*?)<\/title>/i', $str, $matches)) { 
     return $matches[1]; 
    } 
    else { 
     return null; 
    } 
} 

?> 

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <title>PHP file_get_contents()</title> 
</head> 
<body> 
    <div class="url_class"> 
     <form id="getsrc" method="post"> 
      <input style="width: 300px;" type="text" name="urlinput" id="urlinput" placeholder="URL"> 
      <input type="submit" name="submit" value="Get SRC"> 
     </form> 
    </div> 
    <textarea rows="20" cols="50"> 
<?php 
if (!empty($url_src)) { 
    echo $url_src; 
} 
?> 
    </textarea> 
    <?php echo '<br><span style="color:red">' . $error . '<span>'; ?> 
<?php 
if (!empty($js_url_data)) { 
$script = <<<EOT 
<script> 
    var url_data = $js_url_data; 
    var node = document.createElement("li"); 
    var textnode = document.createTextNode("JavaScript page characters: " + url_data.length); 
    node.appendChild(textnode); 
    document.getElementById("resultList").appendChild(node); 
</script> 
EOT; 
echo $script; 
} 
?> 
</body> 
</html> 
+0

json_encode()はPHP配列またはオブジェクト構造を符号化するように設計されているが、XML/HTMLの操作を行わないよう... –

+0

Iは知っているが、「消毒」のHTMLデータを渡すために他の方法を考えることができませんでしたjavaScriptへ。何か案が? – bsteo

+0

サニタイズされていることを意味しますか:エスケープまたはエンコードされたHTMLタグですか? htmlタグは合計文字列の長さに対して計算する必要がありますか?あなたが達成したいものは私にとってはあまり明確ではないかもしれませんが、近似解答を得るでしょう...あなたが目標を示している例を追加すればもっと多くのことができると思います:) –

答えて

0

善良な答えがないので、私は私の問題に私の解決策を掲載するだろう。私が見つけることができる唯一の方法は、$url_dataを16進数でエンコードしてJSに渡し、デコードして文字を数えさせることでした。 pack()関数の場合、私はphp.jsに移植されたものを使用しました。

... 
$js_url_data = bin2hex($url_data); 
... 
if (!empty($js_url_data)) { 
/* This is a good example when one is forced to use inline JS */ 
$script = <<<EOT 
<script> 
    var url_data = "$js_url_data"; 
    var url_data_len = pack('H*', url_data).length; 
    var node = document.createElement("li"); 
    var textnode = document.createTextNode("JavaScript calculation page characters: " + url_data_len); 
    node.appendChild(textnode); 
    document.getElementById("resultList").appendChild(node); 
</script> 
EOT; 
echo $script; 
... 
0

単にPHPで算出される値を使用し、それはEOTブロック内で使用することができます。

... 
if ($_SERVER['REQUEST_METHOD'] === 'POST') { 
if (isset($_POST['urlinput']) && !filter_var($_POST['urlinput'], FILTER_VALIDATE_URL) === false) { 
    ... 
    $url_data = @file_get_contents($url); 
    $fileSize = strlen($url_data); 
    ... 
} 
.... 

if (!empty($js_url_data)) { 
$script = <<<EOT 
<script> 
    ... 
    var textnode = document.createTextNode("JavaScript page characters: " + $fileSize); 
    ... 
</script> 
EOT; 

エコー$スクリプト。

+0

これは簡単です、私は知っています。問題は、PHPの計算ではなくJSの 'data.length'の値を使う必要があることです。 – bsteo

関連する問題