如何在此代码中将de eregi更改为preg_match?

时间:2010-09-29 11:41:49

标签: php preg-match eregi

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)) { 

解决了,谢谢你的所有答案!

2 个答案:

答案 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()开头的,你需要帮助吗?

如果是这种情况,您需要按如下方式进行更改:

  • 首先,匹配字符串需要以正则表达式标记字符开头和结尾(通常/用于此)。
  • 其次,由于您指定了eregi(),因此您还需要向preg_match添加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字符串函数之一。这样会更有效率。