首页 > 解决方案 > 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。

标签: php

解决方案


虽然它不像我最初根据您的描述想象的那么糟糕,但您的代码仍然非常脆弱,并且真的只是偶然地起作用。如果您有任何其他数字或连字符,则会出错,如下所示。

$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)
);

最后,很多人都倾向于将尽可能多的逻辑塞进正则表达式中。如果我想上面可以是一个单一的正则表达式,但它也将是僵化的、不可读的和不可维护的。谨慎使用正则表达式,因为几乎总是有一个解析器/库已经完成了你想要的,或者大部分。


推荐阅读