У меня есть функция, которая проверяет, соответствует ли строка (параметр) значениям в массиве и возвращает массив ключей возможностей
function find_possible_match( $criteria ) {
$possible_match = array();
$possibilities = array(
"a"=>".-",
"b"=>"-...",
"c"=>"-.-.",
"d"=>"-..",
"e"=>".",
"f"=>"..-.",
"g"=>"--.",
"h"=>"....",
"i"=>"..",
"j"=>".---",
"k"=>"-.-",
"l"=>".-..",
"m"=>"--",
"n"=>"-.",
"o"=>"---",
"p"=>".--.",
"q"=>"--.-",
"r"=>".-.",
"s"=>"...",
"t"=>"-",
"u"=>"..-",
"v"=>"...-",
"w"=>".--",
"x"=>"-..-",
"y"=>"-.--",
"z"=>"--..",
"0"=>"-----",
"1"=>".----",
"2"=>"..---",
"3"=>"...--",
"4"=>"....-",
"5"=>".....",
"6"=>"-....",
"7"=>"--...",
"8"=>"---..",
"9"=>"----.",
"."=>".-.-.-",
","=>"--..--",
"?"=>"..--..",
"/"=>"-..-.",
" "=>" ");
foreach ( $possibilities as $key => $value ) {
if( $value == $criteria ){
array_push( $possible_match , $key );
}
}
return $possible_match;
}
это довольно стандартный, все критерии, где строка, как
find_possible_match( ".-" );
вернет [а] … и т. д.
но поворот в том, что, если в params есть неизвестный пример
find_possible_match("?");
должен вернуть [e, t], аналогично
find_possible_match("?.")
должен вернуть [‘i’, ‘n’] и
find_possible_match(".?")
должен вернуть [‘i’, ‘a’]
? в этом случае подстановочный знак.
Как мне изменить приведенный выше код, чтобы сделать именно это. Спасибо
Вы могли бы использовать preg_match()
Вы проверяете, соответствуют ли критерии $ $value
, Вы могли бы заменить $criteria
в соответствии с требованиями регулярного выражения (escape-точка, convert ?
в [.-]
):
function find_possible_match( $criteria ) {
$criteria = str_replace(['.','?'],['\.','[.-]'],$criteria);
$regexp = '~^'.$criteria.'$~';
$possibilities = array(
"a"=>".-",
"b"=>"-...",
"c"=>"-.-.",
"d"=>"-..",
"e"=>".",
"f"=>"..-.",
"g"=>"--.",
"h"=>"....",
"i"=>"..",
"j"=>".---",
"k"=>"-.-",
"l"=>".-..",
"m"=>"--",
"n"=>"-.",
"o"=>"---",
"p"=>".--.",
"q"=>"--.-",
"r"=>".-.",
"s"=>"...",
"t"=>"-",
"u"=>"..-",
"v"=>"...-",
"w"=>".--",
"x"=>"-..-",
"y"=>"-.--",
"z"=>"--..",
"0"=>"-----",
"1"=>".----",
"2"=>"..---",
"3"=>"...--",
"4"=>"....-",
"5"=>".....",
"6"=>"-....",
"7"=>"--...",
"8"=>"---..",
"9"=>"----.",
"."=>".-.-.-",
","=>"--..--",
"?"=>"..--..",
"/"=>"-..-.",
" "=>" ");
$possible_match = array();
foreach ($possibilities as $key => $value) {
if (preg_match($regexp, $value)) {
array_push($possible_match, $key);
}
}
return $possible_match;
}
print_r(find_possible_match(".-")); // ['a']
print_r(find_possible_match("?")); // ['e','t']
print_r(find_possible_match("?.")); // ['i','n']
print_r(find_possible_match(".?")); // ['i','a']
Выходы:
Array
(
[0] => a
)
Array
(
[0] => e
[1] => t
)
Array
(
[0] => i
[1] => n
)
Array
(
[0] => a
[1] => i
)
Вы можете использовать фильтрацию массива и основные регулярные выражения, чтобы соответствовать $criteria
аргумент:
<?php
function find_possible_match($criteria)
{
$possible_match = array();
$possibilities = array(
"a" => ".-",
"b" => "-...",
"c" => "-.-.",
"d" => "-..",
"e" => ".",
"f" => "..-.",
"g" => "--.",
"h" => "....",
"i" => "..",
"j" => ".---",
"k" => "-.-",
"l" => ".-..",
"m" => "--",
"n" => "-.",
"o" => "---",
"p" => ".--.",
"q" => "--.-",
"r" => ".-.",
"s" => "...",
"t" => "-",
"u" => "..-",
"v" => "...-",
"w" => ".--",
"x" => "-..-",
"y" => "-.--",
"z" => "--..",
"0" => "-----",
"1" => ".----",
"2" => "..---",
"3" => "...--",
"4" => "....-",
"5" => ".....",
"6" => "-....",
"7" => "--...",
"8" => "---..",
"9" => "----.",
"." => ".-.-.-",
"," => "--..--",
"?" => "..--..",
"/" => "-..-.",
" " => " ",
);
// If the criteria matches a possible morse code (including '.' and '-' only)
if(preg_match('~^[\.-]+$~', $criteria)) {
// Filters the array to match the criteria
$possible_match = array_filter($possibilities, function($value) use ($criteria) {
return $value === $criteria;
});
}
// If the criteria includes a wildcard
else if(preg_match('~[?\.-]~', $criteria)) {
// Creates a regular expression to match according to the given wildcards
// Each ? will match a single . or -
$regex = str_replace('.', '\.', $criteria);
$regex = str_replace('?', '[\.-]', $regex);
$regex = "~^{$regex}$~";
// Filters the array to match the criteria
$possible_match = array_filter($possibilities, function($value) use ($criteria, $regex) {
return preg_match($regex, $value);
});
}
// Return matches
return array_keys($possible_match);
}
// Test cases
$test = array(
'.-',
'?',
'?.',
'.?',
);
foreach($test as $criteria) {
print_r(find_possible_match($criteria));
}
Выход:
Array
(
[0] => a
)
Array
(
[0] => e
[1] => t
)
Array
(
[0] => i
[1] => n
)
Array
(
[0] => a
[1] => i
)