php __FILE__里面包含吗?

时间:2018-12-06 23:49:06

标签: php

在文件中的文件中使用__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。

2 个答案:

答案 0 :(得分:0)

虽然它没有我最初根据您的描述所认为的那样糟糕,但是您的代码仍然非常脆弱,并且实际上只是偶然地起作用。如果您还有任何个其他数字或连字符,则会出错,如下所示。

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

最后,很多人试图将尽可能多的逻辑塞入正则表达式中。如果我愿意的话,上面可能只是一个正则表达式,但它也将是僵化,不可读和不可维护的。尽量少使用正则表达式,因为几乎总是有一个解析器/库已经满足您的需要,或者其中的大多数都已完成。

答案 1 :(得分:-1)

快速组合了一个函数,该函数将从页面的url作为变量获取,并用该变量替换所有出现的__FILE__,它可以正常工作。假设用户无法以任何方式编辑URL / URI,这应该可以正常工作。