正则表达式清理方法PHP

时间:2012-03-16 10:00:03

标签: php regex

Goodmorning编码小伙伴,

我正在用特殊字符(&,*等)写一个小的正则表达式太干净的文件名

这就是我的代码的样子:

public function clean($string, $bool = false)
{
  $string = html_entity_decode($string, ENT_QUOTES);
  $string = str_replace("'", "", $string);
  $string = str_replace('"', "", $string);
  $string = str_replace("&", "en", $string);
  $string = str_replace("-", "_", $string);

    //ALLE VAGE TEKENS VERVANGEN MET _
    $weirdChars = Proces::normalInput($string , true);

    if(count($weirdChars[0]) > 0)
    {
        foreach($weirdChars[0] as $char)
        {
            $string = str_replace($char, "_", $string);
        }
    }

  if($bool)
    $string = ucfirst(preg_replace('!_+!', '_', strtolower($string)));
  else
    $string = preg_replace('!_+!', '_', strtolower($string));

  if(isset($string[0]) && $string[0] == "_")
    $string = substr($string, 1);
  if(substr($string, -1) == "_")
    return substr($string,0,-1);

  return $string;
}

public function normalInput($string, $bool = false) //STRING
{
  $patern = '/[^_a-zA-Z0-9-]/';
  if(preg_match_all($patern, $string, $matches))
  {
    if($bool)
        return $matches;
    else
    return false;
  }
  else
  {
    if($bool)
        return $matches;
    else
    return true;
  }
}

这两种方法一起工作并且工作正常,但我注意到了一个小问题。 我在normalInput方法中使用的模式如下:

$patern = '/[^_a-zA-Z0-9-]/';

这很好,但我想排除文件名中的点(否则我的文件扩展名会像blaatfoo_pdf而不是blaatfoo.pdf)。

你能帮我解决这个问题吗?

亲切的问候,

Jordy Suos(在这个美丽的早晨喝一杯咖啡和一根漂亮的香烟......在我身上)

2 个答案:

答案 0 :(得分:3)

Goedemorgen。 ; - )

您可以使用白名单或黑名单:

// Whitelist alphanumeric, underscore, dash and dot
$str = preg_replace("/[^a-z0-9-_\.]/", "_", strtolower($str));

// Blacklist
$str = preg_replace("/[<>'\"\\\/\?\: (... and more) ]/", "_", strtolower($str));

这就是它的全部,所以你不需要两个计算50行的函数。我更喜欢白名单方法,因为你永远不会知道你将收到哪些字符作为输入,并且你的文件名中还有一些你不想要的字符。

我还建议调查你的变量和函数命名,因为$bool并不是真正描述性的。如果需要,请将其称为$ucFirst

答案 1 :(得分:0)

您也可以尝试这样做:

$file_parts = pathinfo($string);
$bad_chars = array_merge(array_map('chr', range(0,31)),array("<", ">", ":", '"', "/", "\\", "|", "?", "*", "."));
$filename = str_replace($bad_chars, "_", $file_parts['filename']);
$string = $filename . "." . $file_parts['extension'];