【问题标题】:php automatically creating hyperlink based on filename with spacesphp根据带空格的文件名自动创建超链接
【发布时间】:2013-01-04 23:05:37
【问题描述】:

可能只是一些小东西,但我正在使用下面的代码来读取目录内的文件并将它们打印为自身的超链接。

它会打印出完整的文件名,但它会创建一个不完整的超链接,只使用直到第一个空格的字符。问题是如何为包含空格的文件创建功能超链接?

$dir = '.';
$dh = opendir($dir);
$file_count = 0;
while (false !== ($file = readdir($dh))) {
    $files[] = $file;
    $file_count += 1;
    echo $file;
}
for ($x = 0; $x < $file_count; $x += 1) {
    echo "<a href=$files[$x]>" . "$files[$x]" . "</a><br>";
}

【问题讨论】:

  • php.net/urlencode - 如果您创建超链接 (URL/URI),则需要遵守规则,否则您使用的语言与您要使用的浏览器不同。小心。当您输出 HTML 时,您还需要创建有效的 HTML。 php.net/htmlspecialchars保重。
  • &lt;a href="value of attribute goes in quotes"&gt;Follow HTML standards&lt;/a&gt;

标签: php file hyperlink directory


【解决方案1】:

我已经在上面的评论中建议使用urlencodehtmlspecialchars

我还建议您使用FilesystemIterator,因为它在您的情况下使用起来非常方便:

$dir = '.';
$files = new FilesystemIterator($dir);

foreach ($files as $path => $fileinfo) {
    $name  = $fileinfo->getBasename();
    $url   = urlencode($name);
    $label = htmlspecialchars($name);
    printf("<a href=\"%s\">%s</a><br>\n", $url, $label);
}

【讨论】:

    【解决方案2】:
    $dir = '.';
    $dh = dir($dir);
    while (FALSE !== ($file = $dh->read())) 
    {
        if ('.' !== $file[0]) // ignore any entry that begins with a '.'
            echo "<a href='" . urlencode($file) . "'>". $file . "</a><br />\n";
    }
    $dh->close();
    

    【讨论】:

      【解决方案3】:

      尝试使用glob();

      foreach (glob("*.*") as $filename) {
              echo "<a href=\"$filename\">$filename</a> <br>";
      }
      

      您可以通过扩展名指定,或者我指定的*.* 这将在它们自己的超链接上显示所有文件。

      【讨论】:

      • 我会用这个方法。这要简单得多。谢谢!
      • 但是由于您在问题中提出的原因,它仍然会破坏您的 HTML。您的问题不是获取目录列表,而是输出它。完成后,您可以选择如何改进获取目录列表。
      【解决方案4】:

      您可能希望在锚标记内的 HREF 属性中添加引号:

       echo "<a href='$files[$x]'>$files[$x]</a><br>";
      

      客户可能认为文件名中空格后面的部分是另一个属性。 (您可能还想使用 htmlentities() 来转义 href 属性中的文件名。)

      【讨论】:

      • 只有在您的文件名不包含空格而是单引号之前... - 出于完全相同的原因,您将再次遇到同样的问题。你真正需要的是 urlencode 首先,例如用于在下一个请求中保留的文件名中的特殊字符。
      • @hakre - 你是对的。最安全的方式可能是:'' 处理非 html 安全字符和非 URL 安全字符。
      • 是的,属性值也应该通过htmlentities 传递,以防万一。对于urlencoded 值,不是这种情况,因此您的建议具有误导性 - 它表明您完全不知道自己在做什么以及出于什么原因(是的,这些计算机在一些观点;))。请参阅eval.in/6016 - 另外,如果您认为这样更安全,请以这种方式回答,您应该始终提供最稳定的代码作为答案,而不仅仅是易碎且很快就会崩溃的拼凑代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      相关资源
      最近更新 更多