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);

此外,使用绝对路径 (like ) 或以(like )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 回答