Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 文件名的字符串消毒剂_Php_String_Sanitization - Fatal编程技术网

Php 文件名的字符串消毒剂

Php 文件名的字符串消毒剂,php,string,sanitization,Php,String,Sanitization,我正在寻找一个php函数,它将清理一个字符串,并使其可以用于文件名。有人知道一个方便的吗 (我可以写一个,但我担心我会忽略一个角色!) 编辑:用于在Windows NTFS文件系统上保存文件 以下表达式创建了一个漂亮、干净且可用的字符串: /[^a-z0-9\._-]+/gi 将今天的财务:账单变成今天的财务账单 根据系统允许的内容添加/删除更多有效字符 或者,您可以尝试创建文件,如果文件不好,则返回错误。不必担心忽略字符-使用您乐于使用的字符的白名单如何?例如,您可以只允许好的ol'a-z,

我正在寻找一个php函数,它将清理一个字符串,并使其可以用于文件名。有人知道一个方便的吗

(我可以写一个,但我担心我会忽略一个角色!)


编辑:用于在Windows NTFS文件系统上保存文件

以下表达式创建了一个漂亮、干净且可用的字符串:

/[^a-z0-9\._-]+/gi
将今天的财务:账单变成今天的财务账单

根据系统允许的内容添加/删除更多有效字符


或者,您可以尝试创建文件,如果文件不好,则返回错误。

不必担心忽略字符-使用您乐于使用的字符的白名单如何?例如,您可以只允许好的ol'
a-z
0-9
\uuu
,以及一个句点(
)的单个实例。这显然比大多数文件系统更具限制性,但应该能保证您的安全。

好吧,tempnam()可以帮您做到这一点

但这创造了一个全新的名字

要清理现有字符串,只需限制用户可以输入的内容,并将其设置为字母、数字、句点、连字符和下划线,然后使用简单的正则表达式进行清理。检查哪些字符需要转义,否则可能会出现误报

$sanitized = preg_replace('/[^a-zA-Z0-9\-\._]/','', $filename);

/
在用户提供的文件名中可能有害。因此,您应该通过以下方式消除这些问题:

$fname = str_replace('..', '', $fname);
$fname = str_replace('/',  '', $fname);

对Tor Valamo的解决方案进行小调整,以解决Dominic Rodger注意到的问题,您可以使用:

// Remove anything which isn't a word, whitespace, number
// or any of the following caracters -_~,;[]().
// If you don't need to handle multi-byte characters
// you can use preg_replace rather than mb_ereg_replace
// Thanks @Łukasz Rysiak!
$file = mb_ereg_replace("([^\w\s\d\-_~,;\[\]\(\).])", '', $file);
// Remove any runs of periods (thanks falstro!)
$file = mb_ereg_replace("([\.]{2,})", '', $file);
单程

$bad='/[\/:*?"<>|]/';
$string = 'fi?le*';

function sanitize($str,$pat)
{
    return preg_replace($pat,"",$str);

}
echo sanitize($string,$bad);
$bad='/[\/:*?“|]/';
$string='fi?le*';
函数清理($str,$pat)
{
返回preg_替换($pat,“,$str);
}
echo清理($string,$bad);
$fname=str_replace('/','$fname)


由于用户可能会使用斜杠分隔两个单词,因此最好用破折号代替NULL,对Sean Vieira的解决方案进行小调整以允许使用单点,您可以使用:

preg_replace("([^\w\s\d\.\-_~,;:\[\]\(\)]|[\.]{2,})", '', $file)

使用rawurlencode()怎么样?

这里有一个功能,它甚至可以对汉字进行消毒:

public static function normalizeString ($str = '')
{
    $str = strip_tags($str); 
    $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
    $str = preg_replace('/[\"\*\/\:\<\>\?\'\|]+/', ' ', $str);
    $str = strtolower($str);
    $str = html_entity_decode( $str, ENT_QUOTES, "utf-8" );
    $str = htmlentities($str, ENT_QUOTES, "utf-8");
    $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
    $str = str_replace(' ', '-', $str);
    $str = rawurlencode($str);
    $str = str_replace('%', '-', $str);
    return $str;
}
publicstaticfunctionnormalizestring($str='')
{
$str=带标签($str);
$str=preg_replace('/[\r\n\t]+/',''$str);
$str=preg\u replace(“/[\”\*\/\:\\?\'\\\\\\\\?\”\\\\\;]+/',“$str”);
$str=strtolower($str);
$str=html_实体_解码($str,ENT_引号,“utf-8”);
$str=htmlentities($str,ENT_引号,“utf-8”);
$str=preg_replace(“/(&)([a-z])([a-z]+;)/i“,'$2',$str);
$str=str_替换(“,”-“,$str);
$str=rawurlencode($str);
$str=str_替换('%','-',$str);
返回$str;
}
下面是解释

  • 剥离HTML标记
  • 拆下断开/卡舌/回位托架
  • 删除文件夹和文件名的非法字符
  • 把字符串放在小写字母里
  • 通过将其转换为html实体,然后删除代码并保留字母,从而删除外国口音,如戥戥
  • 用破折号替换空格
  • 对可能通过前面步骤并在服务器上输入冲突文件名的特殊字符进行编码。例如中文百强网"
  • 用破折号替换“%”,以确保在查询文件时浏览器不会重写文件的链接
  • 好的,一些文件名将不会被更新,但在大多数情况下,它会工作

    前。 原名:“საბეჭდი-და-ტიპოგრაფიული.jpg“

    输出名称:“-E1-83-A1-E1-83-90-E1-83-91-E1-83-94-E1-83-AD-E1-83-93-E1-83-98--E1-83-93-E1-83-90--E1-83-A2-E1-83-98-E1-83-98-E1-83-83-83-9D-E1-83-92-E1-83-A0-E1-83-90-E1-83-A4-E1-83-98-E1-83-83-A3-E1-83-9A-E1-83-98.jpg”

    这样比404错误要好

    希望这是有帮助的


    卡尔。

    这些可能有点重,但它们足够灵活,可以将任何字符串清理成“安全”的
    en
    样式的文件名或文件夹名(或者见鬼,如果你弯曲它,甚至是擦洗过的鼻涕虫之类的东西)

    1) 构建完整文件名(在输入被完全截断的情况下使用回退名称):

    2) 或者只使用过滤器util而不构建完整的文件名(严格模式
    true
    将不允许在文件名中使用[]或()

    3) 以下是这些功能:

    // Returns filesystem-safe string after cleaning, filtering, and trimming input
    function str_file_filter(
        $str,
        $sep = '_',
        $strict = false,
        $trim = 248) {
    
        $str = strip_tags(htmlspecialchars_decode(strtolower($str))); // lowercase -> decode -> strip tags
        $str = str_replace("%20", ' ', $str); // convert rogue %20s into spaces
        $str = preg_replace("/%[a-z0-9]{1,2}/i", '', $str); // remove hexy things
        $str = str_replace("&nbsp;", ' ', $str); // convert all nbsp into space
        $str = preg_replace("/&#?[a-z0-9]{2,8};/i", '', $str); // remove the other non-tag things
        $str = preg_replace("/\s+/", $sep, $str); // filter multiple spaces
        $str = preg_replace("/\.+/", '.', $str); // filter multiple periods
        $str = preg_replace("/^\.+/", '', $str); // trim leading period
    
        if ($strict) {
            $str = preg_replace("/([^\w\d\\" . $sep . ".])/", '', $str); // only allow words and digits
        } else {
            $str = preg_replace("/([^\w\d\\" . $sep . "\[\]\(\).])/", '', $str); // allow words, digits, [], and ()
        }
    
        $str = preg_replace("/\\" . $sep . "+/", $sep, $str); // filter multiple separators
        $str = substr($str, 0, $trim); // trim filename to desired length, note 255 char limit on windows
    
        return $str;
    }
    
    
    // Returns full file name including fallback and extension
    function str_file(
        $str,
        $sep = '_',
        $ext = '',
        $default = '',
        $trim = 248) {
    
        // Run $str and/or $ext through filters to clean up strings
        $str = str_file_filter($str, $sep);
        $ext = '.' . str_file_filter($ext, '', true);
    
        // Default file name in case all chars are trimmed from $str, then ensure there is an id at tail
        if (empty($str) && empty($default)) {
            $str = 'no_name__' . date('Y-m-d_H-m_A') . '__' . uniqid();
        } elseif (empty($str)) {
            $str = $default;
        }
    
        // Return completed string
        if (!empty($ext)) {
            return $str . $ext;
        } else {
            return $str;
        }
    }
    
    所以我们假设一些用户输入是:
    …div/div&;WeißGöbel中文百强网文件名%20%20%21%2C Décor\/..z\..y\..x./“此名称”是&462^^^not=该grrrreat-][09]()1234747)საბეჭდი-და-ტიპოგრაფიული

    我们希望将其转换为更友好的格式,以生成文件名长度为255个字符的tar.gz。下面是一个使用示例。注意:此示例包含格式错误的tar.gz扩展名,作为概念证明,在根据白名单生成字符串后,您仍应过滤ext

    $raw_str='…div/div&;WeißGöbel中文百强网文件名%20%20%21%2C Décor\/..z\..y\..x./“此名称”是&462^^^not=该grrrreat-][09]()1234747)საბეჭდი-და-ტიპოგრაფიული';
    $fallback_str='generated_'.date('Y-m-d_H-m_A');
    $bad_扩展='..t&+++a()r.gz[]';
    echo str_文件($raw_str,'''''.$bad_extension,$fallback_str);
    
    输出将是:
    \u wei\u gbel\u file\u name\u dcor.\uu z.\u y.\u x.\u这个名称是\u 462\u不是\u grrrreat\u09]()1234747)\u tar.gz

    你可以在这里玩:

    或要点:


    编辑:更新了
    的脚本过滤器,而不是空间,更新了3v4l链接

    我现在知道的最好的方法是来自Nette framework的静态方法

    顺便说一句,这将所有的变音符号转换为基本的..š=>sü=>uß=>ss等

    对于文件名,必须在“允许的字符”参数中添加点“.”

    /**
     * Converts to ASCII.
     * @param  string  UTF-8 encoding
     * @return string  ASCII
     */
    public static function toAscii($s)
    {
        static $transliterator = NULL;
        if ($transliterator === NULL && class_exists('Transliterator', FALSE)) {
            $transliterator = \Transliterator::create('Any-Latin; Latin-ASCII');
        }
    
        $s = preg_replace('#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{2FF}\x{370}-\x{10FFFF}]#u', '', $s);
        $s = strtr($s, '`\'"^~?', "\x01\x02\x03\x04\x05\x06");
        $s = str_replace(
            array("\xE2\x80\x9E", "\xE2\x80\x9C", "\xE2\x80\x9D", "\xE2\x80\x9A", "\xE2\x80\x98", "\xE2\x80\x99", "\xC2\xB0"),
            array("\x03", "\x03", "\x03", "\x02", "\x02", "\x02", "\x04"), $s
        );
        if ($transliterator !== NULL) {
            $s = $transliterator->transliterate($s);
        }
        if (ICONV_IMPL === 'glibc') {
            $s = str_replace(
                array("\xC2\xBB", "\xC2\xAB", "\xE2\x80\xA6", "\xE2\x84\xA2", "\xC2\xA9", "\xC2\xAE"),
                array('>>', '<<', '...', 'TM', '(c)', '(R)'), $s
            );
            $s = @iconv('UTF-8', 'WINDOWS-1250//TRANSLIT//IGNORE', $s); // intentionally @
            $s = strtr($s, "\xa5\xa3\xbc\x8c\xa7\x8a\xaa\x8d\x8f\x8e\xaf\xb9\xb3\xbe\x9c\x9a\xba\x9d\x9f\x9e"
                . "\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3"
                . "\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
                . "\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe"
                . "\x96\xa0\x8b\x97\x9b\xa6\xad\xb7",
                'ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt- <->|-.');
            $s = preg_replace('#[^\x00-\x7F]++#', '', $s);
        } else {
            $s = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); // intentionally @
        }
        $s = str_replace(array('`', "'", '"', '^', '~', '?'), '', $s);
        return strtr($s, "\x01\x02\x03\x04\x05\x06", '`\'"^~?');
    }
    
    
    /**
     * Converts to web safe characters [a-z0-9-] text.
     * @param  string  UTF-8 encoding
     * @param  string  allowed characters
     * @param  bool
     * @return string
     */
    public static function webalize($s, $charlist = NULL, $lower = TRUE)
    {
        $s = self::toAscii($s);
        if ($lower) {
            $s = strtolower($s);
        }
        $s = preg_replace('#[^a-z0-9' . preg_quote($charlist, '#') . ']+#i', '-', $s);
        $s = trim($s, '-');
        return $s;
    }
    
    /**
    *转换为ASCII。
    *@param字符串UTF-8编码
    *@返回字符串ASCII
    */
    公共静态函数toAscii($s)
    {
    静态$transiterator=NULL;
    如果
    
    str_file_filter($string, $separator, $strict, $length);
    
    // Returns filesystem-safe string after cleaning, filtering, and trimming input
    function str_file_filter(
        $str,
        $sep = '_',
        $strict = false,
        $trim = 248) {
    
        $str = strip_tags(htmlspecialchars_decode(strtolower($str))); // lowercase -> decode -> strip tags
        $str = str_replace("%20", ' ', $str); // convert rogue %20s into spaces
        $str = preg_replace("/%[a-z0-9]{1,2}/i", '', $str); // remove hexy things
        $str = str_replace("&nbsp;", ' ', $str); // convert all nbsp into space
        $str = preg_replace("/&#?[a-z0-9]{2,8};/i", '', $str); // remove the other non-tag things
        $str = preg_replace("/\s+/", $sep, $str); // filter multiple spaces
        $str = preg_replace("/\.+/", '.', $str); // filter multiple periods
        $str = preg_replace("/^\.+/", '', $str); // trim leading period
    
        if ($strict) {
            $str = preg_replace("/([^\w\d\\" . $sep . ".])/", '', $str); // only allow words and digits
        } else {
            $str = preg_replace("/([^\w\d\\" . $sep . "\[\]\(\).])/", '', $str); // allow words, digits, [], and ()
        }
    
        $str = preg_replace("/\\" . $sep . "+/", $sep, $str); // filter multiple separators
        $str = substr($str, 0, $trim); // trim filename to desired length, note 255 char limit on windows
    
        return $str;
    }
    
    
    // Returns full file name including fallback and extension
    function str_file(
        $str,
        $sep = '_',
        $ext = '',
        $default = '',
        $trim = 248) {
    
        // Run $str and/or $ext through filters to clean up strings
        $str = str_file_filter($str, $sep);
        $ext = '.' . str_file_filter($ext, '', true);
    
        // Default file name in case all chars are trimmed from $str, then ensure there is an id at tail
        if (empty($str) && empty($default)) {
            $str = 'no_name__' . date('Y-m-d_H-m_A') . '__' . uniqid();
        } elseif (empty($str)) {
            $str = $default;
        }
    
        // Return completed string
        if (!empty($ext)) {
            return $str . $ext;
        } else {
            return $str;
        }
    }
    
    $raw_str = '.....&lt;div&gt;&lt;/div&gt;<script></script>&amp; Weiß Göbel 中文百强网File name  %20   %20 %21 %2C Décor  \/.  /. .  z \... y \...... x ./  “This name” is & 462^^ not &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = that grrrreat -][09]()1234747) საბეჭდი-და-ტიპოგრაფიული';
    $fallback_str = 'generated_' . date('Y-m-d_H-m_A');
    $bad_extension = '....t&+++a()r.gz[]';
    
    echo str_file($raw_str, '_', $bad_extension, $fallback_str);
    
    /**
     * Converts to ASCII.
     * @param  string  UTF-8 encoding
     * @return string  ASCII
     */
    public static function toAscii($s)
    {
        static $transliterator = NULL;
        if ($transliterator === NULL && class_exists('Transliterator', FALSE)) {
            $transliterator = \Transliterator::create('Any-Latin; Latin-ASCII');
        }
    
        $s = preg_replace('#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{2FF}\x{370}-\x{10FFFF}]#u', '', $s);
        $s = strtr($s, '`\'"^~?', "\x01\x02\x03\x04\x05\x06");
        $s = str_replace(
            array("\xE2\x80\x9E", "\xE2\x80\x9C", "\xE2\x80\x9D", "\xE2\x80\x9A", "\xE2\x80\x98", "\xE2\x80\x99", "\xC2\xB0"),
            array("\x03", "\x03", "\x03", "\x02", "\x02", "\x02", "\x04"), $s
        );
        if ($transliterator !== NULL) {
            $s = $transliterator->transliterate($s);
        }
        if (ICONV_IMPL === 'glibc') {
            $s = str_replace(
                array("\xC2\xBB", "\xC2\xAB", "\xE2\x80\xA6", "\xE2\x84\xA2", "\xC2\xA9", "\xC2\xAE"),
                array('>>', '<<', '...', 'TM', '(c)', '(R)'), $s
            );
            $s = @iconv('UTF-8', 'WINDOWS-1250//TRANSLIT//IGNORE', $s); // intentionally @
            $s = strtr($s, "\xa5\xa3\xbc\x8c\xa7\x8a\xaa\x8d\x8f\x8e\xaf\xb9\xb3\xbe\x9c\x9a\xba\x9d\x9f\x9e"
                . "\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3"
                . "\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8"
                . "\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe"
                . "\x96\xa0\x8b\x97\x9b\xa6\xad\xb7",
                'ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt- <->|-.');
            $s = preg_replace('#[^\x00-\x7F]++#', '', $s);
        } else {
            $s = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); // intentionally @
        }
        $s = str_replace(array('`', "'", '"', '^', '~', '?'), '', $s);
        return strtr($s, "\x01\x02\x03\x04\x05\x06", '`\'"^~?');
    }
    
    
    /**
     * Converts to web safe characters [a-z0-9-] text.
     * @param  string  UTF-8 encoding
     * @param  string  allowed characters
     * @param  bool
     * @return string
     */
    public static function webalize($s, $charlist = NULL, $lower = TRUE)
    {
        $s = self::toAscii($s);
        if ($lower) {
            $s = strtolower($s);
        }
        $s = preg_replace('#[^a-z0-9' . preg_quote($charlist, '#') . ']+#i', '-', $s);
        $s = trim($s, '-');
        return $s;
    }
    
    function filter_filename($name) {
        // remove illegal file system characters https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words
        $name = str_replace(array_merge(
            array_map('chr', range(0, 31)),
            array('<', '>', ':', '"', '/', '\\', '|', '?', '*')
        ), '', $name);
        // maximise filename length to 255 bytes http://serverfault.com/a/9548/44086
        $ext = pathinfo($name, PATHINFO_EXTENSION);
        $name= mb_strcut(pathinfo($name, PATHINFO_FILENAME), 0, 255 - ($ext ? strlen($ext) + 1 : 0), mb_detect_encoding($name)) . ($ext ? '.' . $ext : '');
        return $name;
    }
    
     ' onerror= 'alert(document.cookie).jpg
    
    <img src='<? echo $image ?>' />
    // output:
    <img src=' ' onerror= 'alert(document.cookie)' />
    
    $special_chars = array("?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", "%", "+", chr(0));
    // ... a few rows later are whitespaces removed as well ...
    preg_replace( '/[\r\n\t -]+/', '-', $filename )
    
    function filter_filename($filename, $beautify=true) {
        // sanitize filename
        $filename = preg_replace(
            '~
            [<>:"/\\|?*]|            # file system reserved https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words
            [\x00-\x1F]|             # control characters http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx
            [\x7F\xA0\xAD]|          # non-printing characters DEL, NO-BREAK SPACE, SOFT HYPHEN
            [#\[\]@!$&\'()+,;=]|     # URI reserved https://tools.ietf.org/html/rfc3986#section-2.2
            [{}^\~`]                 # URL unsafe characters https://www.ietf.org/rfc/rfc1738.txt
            ~x',
            '-', $filename);
        // avoids ".", ".." or ".hiddenFiles"
        $filename = ltrim($filename, '.-');
        // optional beautification
        if ($beautify) $filename = beautify_filename($filename);
        // maximize filename length to 255 bytes http://serverfault.com/a/9548/44086
        $ext = pathinfo($filename, PATHINFO_EXTENSION);
        $filename = mb_strcut(pathinfo($filename, PATHINFO_FILENAME), 0, 255 - ($ext ? strlen($ext) + 1 : 0), mb_detect_encoding($filename)) . ($ext ? '.' . $ext : '');
        return $filename;
    }
    
    function beautify_filename($filename) {
        // reduce consecutive characters
        $filename = preg_replace(array(
            // "file   name.zip" becomes "file-name.zip"
            '/ +/',
            // "file___name.zip" becomes "file-name.zip"
            '/_+/',
            // "file---name.zip" becomes "file-name.zip"
            '/-+/'
        ), '-', $filename);
        $filename = preg_replace(array(
            // "file--.--.-.--name.zip" becomes "file.name.zip"
            '/-*\.-*/',
            // "file...name..zip" becomes "file.name.zip"
            '/\.{2,}/'
        ), '.', $filename);
        // lowercase for windows/unix interoperability http://support.microsoft.com/kb/100625
        $filename = mb_strtolower($filename, mb_detect_encoding($filename));
        // ".file-name.-" becomes "file-name"
        $filename = trim($filename, '.-');
        return $filename;
    }
    
    echo filter_var(
       "Lorem Ipsum has been the industry's",FILTER_SANITIZE_URL
    ); 
    
    URL:  http://stackoverflow.com/questions/2021624/string-sanitizer-for-filename
    File: http-stackoverflow-com-questions-2021624-string-sanitizer-for-filename
    
    URL:  https://www.amazon.com/Interstellar-Matthew-McConaughey/dp/B00TU9UFTS/ref=s9_nwrsa_gw_g318_i10_r?_encoding=UTF8&fpl=fresh&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=desktop-1&pf_rd_r=BS5M1H560SMAR2JDKYX3&pf_rd_r=BS5M1H560SMAR2JDKYX3&pf_rd_t=36701&pf_rd_p=6822bacc-d4f0-466d-83a8-2c5e1d703f8e&pf_rd_p=6822bacc-d4f0-466d-83a8-2c5e1d703f8e&pf_rd_i=desktop
    File: 51301f3edb513f6543779c3a5433b01c
    
    $name = preg_replace('/[^a-zA-Z0-9_-]+/', '-', strtolower($name)).'.'.$extension;