文件中的字符串不起作用

时间:2012-12-11 15:57:57

标签: php string preg-match fread

我遇到一个从文件转换的字符串有问题导致该字符串与直接输入的字符串相同:

这是我的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()时,它在注释掉的字符串上按预期工作,但不在从file创建的字符串上,返回一个空数组。

我错过了什么?感谢。

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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);