【问题标题】:getting file name with regular expression php使用正则表达式 php 获取文件名
【发布时间】:2014-03-30 06:41:58
【问题描述】:

我正在尝试使用正则表达式从 URL 中获取文件名,例如:

$link = "http://localhost/website/index.php";

$pattern = '/.*?\.php';

preg_match($pattern, $link, $matches);

但它返回“//localhost/website/index.php”而不是“index”。

【问题讨论】:

  • 你可以像总司令一样在文件浏览器中获取文件名
  • 请解释一下你的意思?

标签: php regex url preg-match


【解决方案1】:

您的代码甚至可以运行吗?您还没有使用任何分隔符...

使用preg_match,您可以改用否定类,因为/ 匹配第一个/,然后.*? 将匹配直到.php 的所有字符...如果您只想获得index,使用这样的捕获组是最简单的:

$link = "http://localhost/website/index.php";
$pattern = '~([^/]+)\.php~';
preg_match($pattern, $link, $matches);
echo $matches[1];   # Get the captured group from the array $matches

或者你可以简单地使用basename函数:

echo basename($link, ".php");

【讨论】:

  • @AhmedDousa 这是一个分隔符。我可以改用|,或者-#@等。但是,如果我使用/作为分隔符,我将不得不使用这样的模式:/([^\/]+)\.php/(即我需要转义模式中的所有/)。如果我的模式有/,我通常使用~,这样我就不需要转义它们,而且这个符号很少见,所以最好使用。
  • @Jerry,我在图片的帮助下添加了解释。希望你不介意:)
【解决方案2】:

我认为您最好使用专用于该目的的函数,而不是自定义正则表达式。

由于您提供的示例实际上是一个 URL,您可以使用 parse_url 函数:

http://php.net/manual/en/function.parse-url.php

你还应该看看pathinfo(PHP 那里的命名一致性做得很好!):

http://php.net/manual/en/function.pathinfo.php

然后你可以这样做:

$url = 'http://localhost/path/file.php';
$url_info = parse_url($url);
$full_path = $url_info['path'];
$path_info = pathinfo($full_path);
$file_name = $path_info['filename'] . '.' . $path_info['extension'];

print $file_name; // outputs "file.php"

这似乎比使用正则表达式更冗长,但它可能更快,更重要的是,更健壮。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2018-10-19
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多