3v4l.org

run code in 300+ PHP versions simultaneously
<?php abstract class Filter { abstract public static function check($value, array $options = array()); } final class IntFilter { public static function check($value, array $options = array()) { return $value; } } final class StringFilter { const OPTIONS = ['trim', 'empty', 'min', 'max', 'startsWith', 'endsWith']; public static function check($value, array $options = array()) { if (false === is_string($value)) { return false; } foreach(array_keys($options) as $key => $value){ if (false === in_array($key, self::OPTIONS)) { throw new InvalidArgumentException($key . ' inconnu !'); } } if (false !== ($options['trim'] ?? true)) { $value = trim($value); } $length = mb_strlen($value, '8bit'); if ((false === ($options['empty'] ?? true)) && (0 === $length)) { return false; } foreach (['min', 'max'] as $name) { if (isset($options[$name])) { $optionLength = IntFilter::check($options[$name], ['min' => 1]); if (('min' === $name && $length < $optionLength) || ('max' === $name && $length > $optionLength)) { return false; } } } foreach (['startsWith', 'endsWith'] as $name) { if (isset($options[$name])) { $needle = StringFilter::check($options[$name]); if (false === self::$name($value, $needle)) { return false; } } } return $value; } private static function startsWith($haystack, $needle) { return $haystack[0] === $needle[0] ? strncmp($haystack, $needle, mb_strlen($needle, '8bit')) === 0 : false; } private static function endsWith($haystack, $needle) { return self::startsWith(mb_substr($haystack, -mb_strlen($needle, '8bit')), $needle); } } var_dump(StringFilter::check(' r a ', ['min' => 4])); var_dump(StringFilter::check(' r a ', ['max' => 4])); var_dump(StringFilter::check(' r a ', ['min' => 4, 'max' => 4])); var_dump(StringFilter::check(' r a ', ['min' => 5])); var_dump(StringFilter::check(' r a ', ['max' => 3])); var_dump(StringFilter::check(' r a ', ['min' => 5, 'max' => 4])); var_dump(StringFilter::check(' r a ', ['min' => 4, 'max' => 3])); var_dump(StringFilter::check(' r a ', ['min' => 5, 'max' => 3])); var_dump(StringFilter::check(' r a ', ['startsWith' => 'r'])); var_dump(StringFilter::check(' r a ', ['endsWith' => 'a'])); var_dump(StringFilter::check(' r a ', ['startsWith' => 'r', 'endsWith' => 'a'])); var_dump(StringFilter::check(' r a ', ['startsWith' => 'r at'])); var_dump(StringFilter::check(' r a ', ['endsWith' => 'r at'])); var_dump(StringFilter::check(' r a ', ['startsWith' => 'r at', 'endsWith' => 'r at'])); var_dump(StringFilter::check(' r a ', ['startsWith' => 'z'])); var_dump(StringFilter::check(' r a ', ['endsWith' => 'z'])); var_dump(StringFilter::check(' r a ', ['startsWith' => 'r', 'endsWith' => 'z'])); var_dump(StringFilter::check(' r a ', ['startsWith' => 'z', 'endsWith' => 'a'])); var_dump(StringFilter::check(' r a ', ['startsWith' => 'z', 'endsWith' => 'y'])); var_dump(StringFilter::check(' r a ', ['test' => 4]));
Output for 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.7
Fatal error: Uncaught InvalidArgumentException: 0 inconnu ! in /in/VRNQp:28 Stack trace: #0 /in/VRNQp(76): StringFilter::check('min', Array) #1 {main} thrown in /in/VRNQp on line 28
Process exited with code 255.
Output for 7.0.0 - 7.0.20, 7.1.0 - 7.1.33, 7.2.6 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33
bool(false) string(3) "max" Fatal error: Uncaught InvalidArgumentException: 1 inconnu ! in /in/VRNQp:28 Stack trace: #0 /in/VRNQp(78): StringFilter::check('max', Array) #1 {main} thrown in /in/VRNQp on line 28
Process exited with code 255.

preferences:
166.41 ms | 403 KiB | 203 Q