在文件中的文件中使用__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。
答案 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,这应该可以正常工作。