PHP:preg_match():分隔符不能是字母数字或反斜杠

时间:2013-07-02 08:28:44

标签: php preg-match warnings

我正在创建一个php文件来搜索引入该名称的目录中的图像,但是函数preg_match会返回这个错误:“警告:preg_match():分隔符不能是字母数字或反斜杠”。代码是这样的:

<?php
$ruta='fotos'; 
// Usamos dir 
$dir=dir($ruta);     
// Archivo a Buscar 

$busqueda=$_POST['busqueda'] ;
$buscar = $busqueda; 

// Recorremos los Archivos del Directorio 
while ($elemento = $dir->read()) 
{     
     // Evitamos el . y ... 
    if ( ($elemento != '.') and ($elemento != '..')) 
    { 
        // Vemos si Existe el Archivo 
        if (preg_match($buscar, $elemento) AND is_file($ruta.$elemento)  ) 
        { 
            echo " Archivo : $elemento <br>"; 
        } 


    }       
}     
?>

它为循环中的每次迭代提供了警告。 I ve trying to fix it but I can吨。请问有人帮帮我吗?

2 个答案:

答案 0 :(得分:0)

你对这个问题没有做足够的研究。

$buscar = "arica"; 

我的猜测是你的模式。我在这里看不到任何正则表达式,但是它需要有分隔符。

From php manual:

  

使用PCRE功能时,要求图案由分隔符包围。分隔符可以是任何非字母数字,非反斜杠,非空白字符。

     

经常使用的分隔符是正斜杠(/),哈希符号(#)和波浪号(〜)。以下是有效分隔模式的所有示例。

所以你需要使用一个分隔符,例如

$buscar = "/arica/"; 

但是在你的情况下删除preg_match()并简单地使用

$buscar == $elemento

它也会这样做。

Morover,你应该考虑使用DirectoryIterator。有了它,您可以将代码更改为

$ruta='fotos'; 
$busqueda=$_POST['busqueda'] 
$iterator = new DirectoryIterator($ruta);
foreach ($iterator as $fileinfo) {
  if ($fileinfo->isFile() && $fileinfo->getFileName() == $busqueda) {
       echo " Archivo : $elemento <br>"; // here can be added 'break' I guess there is only 1 file with name you search for.
  }
}

我不知道你想要实现什么,但也许你应该使用file_exists();

答案 1 :(得分:0)

错误是由preg_match($buscar, $elemento)引起的。该调用成功或失败取决于$buscar的值。但是,由于

$buscar来自用户
$busqueda=$_POST['busqueda'] ;
$buscar = $busqueda;

首先,没有多少用户能够制定正则表达式,因此向用户询问正则表达式可能不是一个好主意。我不知道你是否打算这样做,因为变量$buscar之前被定义为$buscar = "arica"(为不同的目的重用同一个变量不是一个好主意,它会让开发人员感到困惑。)< / p>

其次,作为模式传递给preg_match()的字符串必须包含分隔符。我不知道a中的$buscar = "arica"是否是一个有效的分隔符,它肯定是一个不常见的分隔符(通常,/被选为分隔符,但其他人也可以工作)。所以它应该是

$buscar = "/arica/";

但请注意/arica/不会被用作正则表达式,因为我之前说过。