Add valid regex string check
This commit is contained in:
@@ -127,6 +127,13 @@ $input_string = "AaBbCc";
|
|||||||
print "Unique: " . Strings::removeDuplicates($input_string) . "<br>";
|
print "Unique: " . Strings::removeDuplicates($input_string) . "<br>";
|
||||||
print "Unique: " . Strings::removeDuplicates(strtolower($input_string)) . "<br>";
|
print "Unique: " . Strings::removeDuplicates(strtolower($input_string)) . "<br>";
|
||||||
|
|
||||||
|
$regex_string = "/^[A-z]$/";
|
||||||
|
print "Regex valid: " . $regex_string . ": "
|
||||||
|
. DgS::prBl(Strings::isValidRegexSimple($regex_string)) . "<br>";
|
||||||
|
$regex_string = "/^[A-z";
|
||||||
|
print "Regex valid: " . $regex_string . ": "
|
||||||
|
. DgS::prBl(Strings::isValidRegexSimple($regex_string)) . "<br>";
|
||||||
|
|
||||||
print "</body></html>";
|
print "</body></html>";
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ namespace CoreLibs\Combined;
|
|||||||
|
|
||||||
class ArrayHandler
|
class ArrayHandler
|
||||||
{
|
{
|
||||||
|
public const string DATA_SEPARATOR = '#';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* searches key = value in an array / array
|
* searches key = value in an array / array
|
||||||
* only returns the first one found
|
* only returns the first one found
|
||||||
@@ -148,18 +150,22 @@ class ArrayHandler
|
|||||||
* array search simple. looks for key, value combination, if found, returns true
|
* array search simple. looks for key, value combination, if found, returns true
|
||||||
* on default does not strict check, so string '4' will match int 4 and vica versa
|
* on default does not strict check, so string '4' will match int 4 and vica versa
|
||||||
*
|
*
|
||||||
* @param array<mixed> $array search in as array
|
* @param array<mixed> $array search in as array
|
||||||
* @param string|int $key key (key to search in)
|
* @param string|int $key key (key to search in)
|
||||||
* @param string|int|bool $value value (what to find)
|
* @param string|int|bool|array<string|int|bool> $value values list (what to find)
|
||||||
* @param bool $strict [false], if set to true, will strict check key/value
|
* @param bool $strict [false], if set to true, will strict check key/value
|
||||||
* @return bool true on found, false on not found
|
* @return bool true on found, false on not found
|
||||||
*/
|
*/
|
||||||
public static function arraySearchSimple(
|
public static function arraySearchSimple(
|
||||||
array $array,
|
array $array,
|
||||||
string|int $key,
|
string|int $key,
|
||||||
string|int|bool $value,
|
string|int|bool|array $value,
|
||||||
bool $strict = false
|
bool $strict = false
|
||||||
): bool {
|
): bool {
|
||||||
|
// convert to array
|
||||||
|
if (!is_array($value)) {
|
||||||
|
$value = [$value];
|
||||||
|
}
|
||||||
foreach ($array as $_key => $_value) {
|
foreach ($array as $_key => $_value) {
|
||||||
// if value is an array, we search
|
// if value is an array, we search
|
||||||
if (is_array($_value)) {
|
if (is_array($_value)) {
|
||||||
@@ -167,9 +173,9 @@ class ArrayHandler
|
|||||||
if (($result = self::arraySearchSimple($_value, $key, $value, $strict)) !== false) {
|
if (($result = self::arraySearchSimple($_value, $key, $value, $strict)) !== false) {
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
} elseif ($strict === false && $_key == $key && $_value == $value) {
|
} elseif ($strict === false && $_key == $key && in_array($_value, $value)) {
|
||||||
return true;
|
return true;
|
||||||
} elseif ($strict === true && $_key === $key && $_value === $value) {
|
} elseif ($strict === true && $_key === $key && in_array($_value, $value, true)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -236,6 +242,95 @@ class ArrayHandler
|
|||||||
return $hit_list;
|
return $hit_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: move to CoreLibs
|
||||||
|
* Search in an array for value and check in the same array block for the required key
|
||||||
|
* If not found return an array with the array block there the required key is missing,
|
||||||
|
* the path as string with seperator block set and the missing key entry
|
||||||
|
*
|
||||||
|
* @param array<mixed> $array
|
||||||
|
* @param string|int|float|bool $search_value
|
||||||
|
* @param string $required_key
|
||||||
|
* @param string $current_path
|
||||||
|
* @return array<array{content?:array<mixed>,path?:string,missing_key?:string}>
|
||||||
|
*/
|
||||||
|
public static function findArraysMissingKey(
|
||||||
|
array $array,
|
||||||
|
string|int|float|bool $search_value,
|
||||||
|
string $required_key,
|
||||||
|
string $current_path = ''
|
||||||
|
): array {
|
||||||
|
$results = [];
|
||||||
|
|
||||||
|
foreach ($array as $key => $value) {
|
||||||
|
$path = $current_path ? $current_path . self::DATA_SEPARATOR . $key : $key;
|
||||||
|
|
||||||
|
if (is_array($value)) {
|
||||||
|
// Check if this array contains the search value
|
||||||
|
$containsValue = in_array($search_value, $value, true);
|
||||||
|
|
||||||
|
// If it contains the value but doesn't have the required key
|
||||||
|
if ($containsValue && !array_key_exists($required_key, $value)) {
|
||||||
|
$results[] = [
|
||||||
|
'content' => $value,
|
||||||
|
'path' => $path,
|
||||||
|
'missing_key' => $required_key
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recursively search nested arrays
|
||||||
|
$results = array_merge(
|
||||||
|
$results,
|
||||||
|
self::findArraysMissingKey($value, $search_value, $required_key, $path)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: move to CoreLibs
|
||||||
|
* currenly only over one level, find key => value entry and return set with key
|
||||||
|
* for all matching
|
||||||
|
*
|
||||||
|
* @param array<mixed> $array
|
||||||
|
* @param string $lookup
|
||||||
|
* @param int|string|float|bool $search
|
||||||
|
* @param bool $strict [default=false]
|
||||||
|
* @param bool $case_senstivie [default=false]
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public static function selectArrayFromOption(
|
||||||
|
array $array,
|
||||||
|
string $lookup,
|
||||||
|
int|string|float|bool $search,
|
||||||
|
bool $strict = false,
|
||||||
|
bool $case_senstivie = false,
|
||||||
|
): array {
|
||||||
|
$result = [];
|
||||||
|
if ($case_senstivie && is_string($search)) {
|
||||||
|
$search = strtolower($search);
|
||||||
|
}
|
||||||
|
foreach ($array as $key => $value) {
|
||||||
|
// skip on not set
|
||||||
|
if (!isset($value[$lookup])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($case_senstivie && is_string($value[$value])) {
|
||||||
|
$value[$lookup] = strtolower($value[$value]);
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
($strict && $search === $value[$lookup]) ||
|
||||||
|
(!$strict && $search == $value[$lookup])
|
||||||
|
) {
|
||||||
|
$result[$key] = $value;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* main wrapper function for next/prev key
|
* main wrapper function for next/prev key
|
||||||
*
|
*
|
||||||
@@ -553,7 +648,8 @@ class ArrayHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modifieds the key of an array with a prefix and/or suffix and returns it with the original value
|
* Modifieds the key of an array with a prefix and/or suffix and
|
||||||
|
* returns it with the original value
|
||||||
* does not change order in array
|
* does not change order in array
|
||||||
*
|
*
|
||||||
* @param array<string|int,mixed> $in_array
|
* @param array<string|int,mixed> $in_array
|
||||||
@@ -581,6 +677,41 @@ class ArrayHandler
|
|||||||
array_values($in_array)
|
array_values($in_array)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sort array and return in same call
|
||||||
|
* sort ascending, value
|
||||||
|
*
|
||||||
|
* @param array<mixed> $array array to sort by values
|
||||||
|
* @param int $params sort flags
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public function sortArray(array $array, int $params = SORT_REGULAR): array
|
||||||
|
{
|
||||||
|
return sort($array, $params) ? $array : $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sort by key ascending and return
|
||||||
|
*
|
||||||
|
* @param array<mixed> $array
|
||||||
|
* @param bool $lower_case [default=false]
|
||||||
|
* @return array<mixed>
|
||||||
|
*/
|
||||||
|
public static function ksortArray(array $array, bool $lower_case = false): array
|
||||||
|
{
|
||||||
|
$fk_sort_lower_case = function (string $a, string $b): int {
|
||||||
|
return strtolower($a) <=> strtolower($b);
|
||||||
|
};
|
||||||
|
$fk_sort = function (string $a, string $b): int {
|
||||||
|
return $a <=> $b;
|
||||||
|
};
|
||||||
|
uksort(
|
||||||
|
$array,
|
||||||
|
$lower_case ? $fk_sort_lower_case : $fk_sort
|
||||||
|
);
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
@@ -252,6 +252,23 @@ class Strings
|
|||||||
)
|
)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a regex is valid. Does not return the detail regex parser error
|
||||||
|
*
|
||||||
|
* @param string $pattern Any regex string
|
||||||
|
* @return bool False on invalid regex
|
||||||
|
*/
|
||||||
|
public static function isValidRegexSimple(string $pattern): bool
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$var = '';
|
||||||
|
@preg_match($pattern, $var);
|
||||||
|
return preg_last_error() === PREG_NO_ERROR;
|
||||||
|
} catch (\Error $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// __END__
|
// __END__
|
||||||
|
|||||||
Reference in New Issue
Block a user