PHP如何输出包含撇号的文件名作为有效的HTML


PHP how to output filename containing apostrophe as valid HTML

我是PHP新手,并从http://www.techrepublic.com/article/create-a-dynamic-photo-gallery-with-php-in-three-steps/(在问题的底部)改编了一个脚本,该脚本从目录生成图像表以及一些附带的EXIF数据。但是,这个脚本除了在文件名中包含单个撇号'的三个图像之外,其他的都可以使用。在一种情况下,脚本输出如下HTML:

<img src='../assets/img/art/Red Sky at Night, Sailor's Delight  I.jpg'> 

当然是无效的HTML。我不能使用以下脚本

echo '<tr><td rowspan="3"><img src="$dir/$file"></td>';

,因为它会导致由文件名中的撇号引起的PHP错误。

因为:

  1. 我使用包含图像标题的表格单元格的文件名
  2. 我希望标题能够包含撇号。

我希望能够在文件名中保留撇号。

是否有任何方法来修复我的PHP脚本,允许我在文件名中保留撇号,同时仍然输出有效的HTML?

<table class="catalog">
  <?php
  // define directory path
  $dir = "../assets/img/art";
  // iterate through files
  // look for JPEGs
  if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
      while (($file = readdir($dh)) !== false) {
        if (preg_match("/.jpg/", $file)) {
          // read EXIF headers
          $exif = exif_read_data("$dir/$file", "FILE,COMPUTED,ANY_TAG,IFD0,THUMBNAIL,COMMENT,EXIF", true);
          // get image
          echo "<tr><td rowspan='3'><img src='$dir/$file'></td>";
          // get file name
          echo "<th>Title</th><td>" . str_replace(".jpg", "", $file) . "</td></tr>";
          // get timestamp
          echo "<tr><th>Year</th><td>"  . $exif['IFD0']['Copyright'] . "</td></tr>";
          // get image dimensions
          echo "<tr><th>Description</th><td>" . $exif['IFD0']['ImageDescription'] . "</td></tr>";
        }
      }
      closedir($dh);
    }
  }
  ?>
</table>

如果你在HTML中使用双引号,你就不会有这个问题了。

echo '<tr><td rowspan="3"><img src="'.$dir.'/'.$file.'"></td>';

…直到人们开始在文件名中加上双引号:)


从你的问题:

echo '<tr><td rowspan="3"><img src="$dir/$file"></td>';

中的撇号会导致PHP错误文件名。

这不是真的。这种方法的问题是,变量在单引号内不计算,所以在HTML中的输出将是;<tr><td rowspan="3"><img src="$dir/$file"></td>。这就是为什么我在我的例子中使用字符串连接。