=X.Y.0 and <(X+1).0.0 * - "^X.Y.Z" — caret: >=X.Y.Z and <(X+1).0.0 * - "~X.Y" — tilde: >=X.Y.0 and =X.Y.Z and =X.Y[.Z]" — inclusive lower bound * - "<=X.Y[.Z]" — inclusive upper bound * - ">X.Y[.Z]" — exclusive lower bound * - "=' ) && version_compare( $current, $max, '<' ); } // Tilde: ~X.Y or ~X.Y.Z if ( preg_match( '/^~(\d+)\.(\d+)(?:\.(\d+))?$/', $constraint, $m ) ) { $min = $m[1] . '.' . $m[2] . '.' . ( $m[3] ?? '0' ); $maxMinor = (int) $m[2] + 1; $max = $m[1] . '.' . $maxMinor . '.0'; return version_compare( $current, $min, '>=' ) && version_compare( $current, $max, '<' ); } // Comparison operator: >=, <=, >, <, =, or no operator (exact) if ( preg_match( '/^(>=|<=|>|<|=)?\s*(\d+\.\d+(?:\.\d+)?)$/', $constraint, $m ) ) { $op = $m[1] !== '' ? $m[1] : '='; $version = $m[2]; return version_compare( $current, $version, $op ); } return false; } }