【问题标题】:Downloading file matching pattern using phpseclib使用 phpseclib 下载文件匹配模式
【发布时间】:2015-05-22 16:49:56
【问题描述】:

我正在尝试从 SFTP 服务器下载文件。我设法连接到它并下载文件。问题是服务器中的文件每天都会更新,文件名的一部分是它生成的确切时间,这是不可预测的。

如何实现我的 PHP 脚本,以便它下载任何名称以特定模式开头但我不知道确切全名的 XML 文件?

【问题讨论】:

  • 您可以在 ftp 服务器上执行 ls 解析出您的 xml 文件名并将其发送到下载。
  • 如果有很多 xml 文件,请使用正则表达式
  • 它们可能是很多 xml 文件,因为每天都会生成一个新文件。你能给我更多关于正则表达式的提示吗?我不熟悉这个。非常感谢你!我试过把 * 放在文件名中,但如果你的意思类似的话,它不起作用

标签: php filenames sftp phpseclib


【解决方案1】:

您必须使用Net_SFTP::nlist 检索远程目录中所有文件的列表。

然后您迭代列表,找到符合您要求的文件名。

然后你使用Net_SFTP::get下载选择的文件。

include("Net/SFTP.php");

$sftp = new Net_SFTP("host");

if (!$sftp->login("username", "password"))
{
    die("Cannot connect");
}

$path = "/remote/path";
$list = $sftp->nlist($path);

if ($list === false)
{
    die("Error listing directory ".$path);
}

$prefix = "prefix";
$matches = preg_grep("/^$prefix.*/i", $list);
if (count($matches) != 1)
{
    die("No file or more than one file matches the pattern: ".implode(",", $matches));
}

$matches = array_values($matches);
$filename = $matches[0];
$filepath = $path."/".$filename;
if (!$sftp->get($filepath, $filename))
{
    die("Error downloading file ".$filepath);
}

【讨论】:

  • 非常感谢您的回答!我想过类似的事情,但预计会很复杂,用你的话我看到了光,现在它正在工作!
【解决方案2】:

正则表达式(缩写为正则表达式或正则表达式,有时也称为有理表达式)是形成搜索模式的字符序列,主要用于与字符串的模式匹配或字符串匹配,即“查找和替换”-喜欢操作,非常适合您的需要。这里有更多关于正则表达式的背景:http://en.m.wikipedia.org/wiki/Regular_expression

供您测试:http://www.phpliveregex.com

这是一个例子: http://php.net/manual/en/function.preg-match.php

<?php
$subject = "abcdef";
$pattern = '/^def/';
preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
?>

【讨论】:

    猜你喜欢
    • 2014-12-17
    • 2021-09-27
    • 2020-01-31
    • 2022-01-16
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多