PluginProbe
Blocks – Reusable Content, Shortcodes & Site Variables / trunk
Blocks – Reusable Content, Shortcodes & Site Variables vtrunk
26.09.03.15 26.08.31.21 26.08.22.20 26.08.22.22 26.08.22.17 26.08.22.13 26.08.21.19 26.08.07.23 26.07.19.14 26.07.13.21 26.07.13.17 26.07.12.13 026.07.07.21 026.07.05.18 026.06.26.20 026.06.26.21 026.06.08.20 026.05.13.14 026.04.29.10 trunk 026.02.22.22 026.03.16.23 026.04.23.13
blocks / includes / signls / src / Sanitizer.php

Sanitizer.php in Blocks – Reusable Content, Shortcodes & Site Variables trunk, at includes/signls/src/Sanitizer.php

99 lines 3.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Closed aggregate value sanitizer.
4 *
5 * @package signls-sdk
6 * @license GPL-3.0-or-later
7 */
8
9 namespace Signls\Sdk\V1;
10
11 defined( 'ABSPATH' ) || exit;
12
13 final class Sanitizer {
14
15 public static function slug( $value, int $max = 48, string $fallback = '' ): string {
16 $value = is_string( $value ) ? strtolower( $value ) : '';
17 return 1 === preg_match( '/^[a-z0-9][a-z0-9_-]{0,' . ( max( 1, $max ) - 1 ) . '}$/', $value ) ? $value : $fallback;
18 }
19
20 public static function version( $value, int $maximum = 20 ): string {
21 $maximum = max( 1, min( 64, $maximum ) );
22 $value = is_string( $value ) ? $value : '';
23 return 1 === preg_match( '/^[A-Za-z0-9][A-Za-z0-9._+-]{0,' . ( $maximum - 1 ) . '}$/', $value ) ? $value : 'unknown';
24 }
25
26 public static function counter( $value ): int {
27 if ( ! is_int( $value ) && ! ctype_digit( (string) $value ) ) {
28 return 0;
29 }
30 $value = (int) $value;
31 return max( 0, min( 4294967295, $value ) );
32 }
33
34 public static function age( $value ) {
35 if ( null === $value ) {
36 return null;
37 }
38 return self::counter( $value );
39 }
40
41 public static function bool( $value ): bool {
42 return true === $value || 1 === $value || '1' === $value;
43 }
44
45 public static function int( $value, int $minimum, int $maximum ): int {
46 if ( ! is_int( $value ) && ! ( is_string( $value ) && 1 === preg_match( '/^-?[0-9]+$/', $value ) ) ) {
47 return $minimum;
48 }
49 return max( $minimum, min( $maximum, (int) $value ) );
50 }
51
52 public static function decimal( $value, float $minimum, float $maximum, int $scale = 4 ): float {
53 if ( ! is_numeric( $value ) ) {
54 return $minimum;
55 }
56 $value = (float) $value;
57 if ( is_nan( $value ) || is_infinite( $value ) ) {
58 return $minimum;
59 }
60 return round( max( $minimum, min( $maximum, $value ) ), max( 0, min( 8, $scale ) ) );
61 }
62
63 public static function enum( $value, array $allowed, string $fallback = '' ): string {
64 $value = is_string( $value ) ? $value : '';
65 return in_array( $value, $allowed, true ) ? $value : $fallback;
66 }
67
68 public static function text( $value, int $maximum ): string {
69 if ( ! is_string( $value ) || $maximum < 1 || 1 !== preg_match( '//u', $value ) || 1 === preg_match( '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/u', $value ) ) {
70 return '';
71 }
72 if ( function_exists( 'mb_substr' ) ) {
73 return mb_substr( $value, 0, $maximum, 'UTF-8' );
74 }
75 if ( false !== preg_match_all( '/./us', $value, $characters ) ) {
76 return implode( '', array_slice( $characters[0], 0, $maximum ) );
77 }
78 return '';
79 }
80
81 public static function url( $value, int $maximum = 500 ): string {
82 $value = self::text( $value, $maximum );
83 if ( '' === $value ) {
84 return '';
85 }
86 $parts = wp_parse_url( $value );
87 if ( ! is_array( $parts ) || ! isset( $parts['scheme'], $parts['host'] ) || isset( $parts['user'] ) || isset( $parts['pass'] ) ) {
88 return '';
89 }
90 $scheme = strtolower( (string) $parts['scheme'] );
91 return in_array( $scheme, array( 'http', 'https' ), true ) ? $value : '';
92 }
93
94 public static function sha256( $value ): string {
95 $value = is_string( $value ) ? $value : '';
96 return 1 === preg_match( '/^[a-f0-9]{64}$/', $value ) ? $value : '';
97 }
98 }
99