3v4l.org

run code in 300+ PHP versions simultaneously
<?php $unclean_name = 'File name %20 %20 %2C Décor \/. /. . z \... y \...... x ./ “This name” is & 462^^ not &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = that grrrreat -][09]()1234747) sdlfjfkleq flekqjelkjqlk fjlkqe fqf'; $seperator = '_'; $fallback_name = 'generated__' . date('Y-m-d_H-m_A'); $max_chars = '180'; $file_extension = '....ta()r.gz[]'; echo str_file($unclean_name, $seperator, $fallback_name, $max_chars, $file_extension); function str_file( $str, $sep = '_', $default = '', $trim = 180, $ext = '' ) { // file name filters used to clean and prepare a string function str_file_filter( $str, $sep = '_', $strict = false, $trim = 180 ) { $str = strip_tags(strtolower($str)); $str = preg_replace("/&#?[a-z0-9]{2,8};/i", '', $str); $str = str_replace("%20", ' ', $str); // $str = preg_replace("/\s+/", $sep, $str); $str = preg_replace("/\.+/", '.', $str); if ($strict) { $str = preg_replace("/([^\w\d\\" . $sep . ".])/", '', $str); // allow only words, digits, underscore, period } else { $str = preg_replace("/([^\w\d\\" . $sep . "\[\]\(\).])/", '', $str); // allow only words, digits, underscore, period, [], () } return substr($str, 0, $trim); } // get or set a default file name in case all chars are trimmed from $str ensuring 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; } // run $str and/or $ext through filters to clean up and remove special chars if (!empty($ext)) { $ext = '.' . $ext; // ensure there is at least 1 period return str_file_filter($str, $sep) . str_file_filter($ext, '', true); } else { return str_file_filter($str, $sep); } }
Output for 5.5.0 - 5.5.38, 5.6.0 - 5.6.40, 7.0.0 - 7.0.33, 7.1.0 - 7.1.33, 7.2.0 - 7.2.26, 7.3.0 - 7.3.13, 7.4.0 - 7.4.1
file_name_2c_dcor_._._._z_._y_._x_._this_name_is__462_not__that_grrrreat_][09]()1234747)_sdlfjfkleq_flekqjelkjqlk_fjlkqe_fqf.tar.gz

preferences:
182.8 ms | 403 KiB | 196 Q