0

ファイルから変換された文字列に問題があり、直接入力された場合と同じように動作します。

これが私のtest.htmlファイルです:

<html>

<font class="editable">
This is editable section 1
</font>
<br><br><hr><br>
<font class="editable">
This is editable section 2
</font>

</html>

これが私のphpファイルです:

<?php

//RETURN ARRAY OF RESULTS FOUND BETWEEN START & END IN STRING
function returnStartEnd($string,$start,$end){ 
     preg_match_all('/' . preg_quote($start, '/') . '(.*?)'. preg_quote($end, '/').'/i', $string, $m); 
     $out = array(); 

     foreach($m[1] as $key => $value){ 
       $type = explode('::',$value); 
       if(sizeof($type)>1){ 
          if(!is_array($out[$type[0]])) 
             $out[$type[0]] = array(); 
          $out[$type[0]][] = $type[1]; 
       } else { 
          $out[] = $value; 
       } 
     } 
  return $out; 
};


// RETURN FILE CONTENTS AS A STRING
function readFileToVar($file){
  $fh = fopen($file,'r') or die($php_errormsg);
  $html = fread($fh,filesize($file));
  return $html;
  fclose($fh) or die($php_errormsg);
};

$file = 'test.html';
$html = readFileToVar($file);
// OR
//$html = '<html> <font class="editable"> This is editable section 1 </font><br><br><hr><br><font class="editable"> This is editable section 2 </font> </html>';
$go = 'editable">';
$stop = '<';

$arrayOfEditables = returnStartEnd($html,$go,$stop);
echo "<br>Result:<br>";
var_dump($arrayOfEditables);

?>

コメントアウトされた$htmlに注意してください。これは、test.htmlファイルから返されるもの(?)と同じです。関数returnStartEnd()を実行しようとすると、コメントアウトされた文字列では期待どおりに機能しますが、ファイルから作成された文字列では機能せず、空の配列が返されます。

私は何が欠けていますか?ありがとう。

4

2 に答える 2

1

file_get_contentsファイルを文字列として変数に読み込むために使用できると思います。
それで:

$html = file_get_contents($file);

また、絶対パス(のような)または接頭辞(のような)dirname(__FILE__)."/file.ext"が付いた相対パスを使用することは常に良い考えです。だからあなたは変えてみることができます./"./file.ext"

$file = 'test.html';

の中へ

$file = './test.html';

あるいは

$file = dirname(__FILE__).'/test.html'
于 2012-12-11T16:12:13.377 に答える
1

問題:

私には、正規表現が複数行で問題を抱えているように見えます。file_get_contents()これは、渡した(をバイパスした)文字列とロードされたファイルの内容の違いのようです。

解決:

複数行を許可するように正規表現の値を変更します。

$expression = '/' . preg_quote($start, '/') . '([\w\s.]*?)'. preg_quote($end, '/') . '/im';

この正規表現は開始点を探し、その開始点と終了点の間のすべての値を文字クラスに入れます。次に、最後に、m複数行モードにする修飾子を追加しました。

私のテストによると、両方の方法で、これが私にとってそれを機能させたものでした:

$html = <<<HTML
<html>

<font class="editable">
This is editable section 1
</font>
<br><br><hr><br>
<font class="editable">
This is editable section 2
</font>

</html>
HTML;

$alternate = '<html><font class="editable">This is editable section 1</font><br><br><hr><br><font class="editable">This is editable section 2</font></html>';

var_dump($html);
$expression = '/' . preg_quote('editable">', '/') . '([\w\s.]*?)'. preg_quote('<', '/') . '/im';
var_dump($expression);

preg_match_all($expression, $html, $m);
var_dump($m);

preg_match_all($expression, $alternate, $m);
var_dump($m);
于 2012-12-11T16:29:14.753 に答える