if (preg_match('^'.preg_quote($this->config_document_root), $filename)) {
$AbsoluteFilename = $filename;
$this->DebugMessage('ResolveFilenameToAbsolute() NOT prepending $this->config_document_root ('.$this->config_document_root.') to $filename ('.$filename.') resulting in ($AbsoluteFilename = "'.$AbsoluteFilename.'")', __FILE__, __LINE__);
} else {
$AbsoluteFilename = $this->config_document_root.$filename;
$this->DebugMessage('ResolveFilenameToAbsolute() prepending $this->config_document_root ('.$this->config_document_root.') to $filename ('.$filename.') resulting in ($AbsoluteFilename = "'.$AbsoluteFilename.'")', __FILE__, __LINE__);
}
}
此代码已通过第一个答案的说明解决,但我如何修复此代码呢?
if (!$this->config_allow_src_above_docroot && !preg_match('^'.preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', realpath($this->config_document_root))), $AbsoluteFilename)) {
解决了,谢谢你的所有答案!
答案 0 :(得分:0)
这个问题有点令人困惑,因为您实际上似乎并未在发布的代码中使用eregi
。
但是,如果要检查$filename
是否以$this->config_document_root
开头,则不需要正则表达式。例如为什么不使用strpos
?
if (strpos($filename, $this->config_document_root) === 0) {
...
在正则表达式中,^
将模式锚定到要匹配的文本的开头,因此如果模式的其余部分只是简单文本,那么这实际上只是以>开头检查,你的第二个例子可以写成:
$docroot = str_replace(DIRECTORY_SEPARATOR, '/', realpath($this->config_document_root));
if (!$this->config_allow_src_above_docroot && strpos($filename, $docroot) !== 0) {
...
答案 1 :(得分:0)
您引用的代码中已经有preg_match,但我可以看到它不起作用。我认为第一行是以eregi()开头的,你需要帮助吗?
如果是这种情况,您需要按如下方式进行更改:
/
用于此)。i
修饰符,以使其不区分大小写。因此给出了一个如下所示的eregi()表达式:
'^matchthis'
您需要将其更改为:
'/^matchthis/i'
显然将 matchthis 替换为匹配字符串(例如示例中的preg_quote($this->config_document_root)
)。
我几天前在PHP中写了a detailed explaination关于ereg和preg之间差异的文章。您可能会发现阅读有用。
但是,在您的示例中,您要检查的是字符串以变量$this->config_document_root
的内容开头。假设$this->config_document_root
本身不包含任何正则表达式模式(并且使用preg_quote实际上保证它不会),实际上你根本不需要使用正则表达式 - 你可以只使用{{1}或其他几个普通的PHP字符串函数之一。这样会更有效率。