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 $name){ if (false === in_array($name, self::OPTIONS)) { throw new InvalidArgumentException($name . ' 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 git.master, git.master_jit, rfc.property-hooks
string(4) "r a" string(4) "r a" string(4) "r a" bool(false) bool(false) bool(false) bool(false) bool(false) string(4) "r a" string(4) "r a" string(4) "r a" bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) Fatal error: Uncaught InvalidArgumentException: test inconnu ! in /in/t3hHp:28 Stack trace: #0 /in/t3hHp(100): StringFilter::check(' r a ', Array) #1 {main} thrown in /in/t3hHp on line 28
Process exited with code 255.

This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.

Active branches

Archived branches

Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page


preferences:
49.8 ms | 402 KiB | 8 Q