php - php __FILE__ 里面包含?
问题描述
我(可能)__FILE__
在文件中的文件中使用时遇到了一个不寻常的问题。
我创建了一段代码(在我的服务器要求的 php 5 中)来获取当前文件名的元素并将其放入一个变量中以供以后使用。经过一番头痛后,我让它工作得很好。然而,我意识到我不想每次都写它并意识到“哦,不,如果我包含它,它只会对包含的文字文件名起作用”。如果我想获取用户正在查看的页面的文件名,而不是包含文件的文字名称,那么最好的方法是什么?从地址栏中获取 URL?使用不同的魔法变量?
EDIT1:示例
我可能应该在初稿中提供一个例子,pfft。假设我对文件进行了编号,包含发生的标题是 01header.php,但它显示的文件是 Article0018.html。我用了:
$bn = (int) filter_var(__FILE__, FILTER_SANITIZE_NUMBER_INT);
…获取文章编号,但意识到它会在标题中获得 1。
EDIT2:临时解决方案
我通过创建一个函数来获取 URL / URI 并将其放入变量 $infile 并用 $infile 替换所有以前的外观来“解决”该问题__FILE__
,如下所示:
function getAddress() {
$protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
return $protocol.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];}
$infile = urlencode(getAddress());
$bn = (int) filter_var($infile, FILTER_SANITIZE_NUMBER_INT);
echo "$bn";
因此,如果用户正在查看的文件名为“005-extremelynormalfile.html”,我可以在页面内显示数字 5,例如,它是文章编号 5。
解决方案
虽然它不像我最初根据您的描述想象的那么糟糕,但您的代码仍然非常脆弱,并且真的只是偶然地起作用。如果您有任何其他数字或连字符,则会出错,如下所示。
$infile = 'https://example-123.com/foo/42/bar/005-extremelynormalfile.html?x=8&y=9';
var_dump(
filter_var($infile, FILTER_SANITIZE_NUMBER_INT),
(int)filter_var($infile, FILTER_SANITIZE_NUMBER_INT)
);
输出:
string(12) "-12342005-89"
int(-12342005)
清理功能是破坏数据的钝器,只有在所有其他良好感觉都失败时才应作为最后的手段使用。
您需要使用适当的解析函数将 url 解析为其组成部分,然后使用简单的正则表达式从文件名中获取您想要的内容。
function getIdFromURL($url) {
$url_parts = parse_url($url);
$path = $url_parts['path'];
$path_parts = explode('/', $path);
$filename = end($path_parts);
if( preg_match('/^(\d+)/', $filename, $matches) ) {
return (int)$matches[1];
}
return null;
}
var_dump(
getIdFromURL($infile)
);
最后,很多人都倾向于将尽可能多的逻辑塞进正则表达式中。如果我想上面可以是一个单一的正则表达式,但它也将是僵化的、不可读的和不可维护的。谨慎使用正则表达式,因为几乎总是有一个解析器/库已经完成了你想要的,或者大部分。
推荐阅读
- ios - iOS 中 FileManager 的内容在哪里?
- javascript - 我的 c++ 代码比 javascript 代码慢很多
- reactjs - 在 React 中下载 excel 文件大小的问题
- reactjs - 设置 CSS 后如何立即运行函数?
- drupal-7 - Drupal 7 上没有存储用户配置文件的图像
- assembly - 为什么在这种情况下使用 IMUL r/m8 指令时设置 OF 和 CF 标志
- python - 如何将社交图书搜索 XML 集合转换为 TREC 集合?
- node.js - webpack 在编译时内存不足
- c# - .Net Core Firebase 使用 JWT 的 Google 电子邮件身份验证 - 401
- algorithm - 从矩阵的每一行和每一列中准确地挑选出一个值