匹配单个未知参数 php(莫尔斯码正则表达式)
Match single unknown parameter php (Morse-code Regex)
我有一个函数可以检查字符串(参数)是否与数组中的值匹配,并且 return 是一个可能性数组键
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( ".-" );
将return [a]...等等
但问题在于,如果参数有一个未知的例子
find_possible_match("?");
应该return[e,t],同样
find_possible_match("?.")
应该return['i','n']和
find_possible_match(".?")
应该return['i','a']
?在这种情况下是通配符。
我如何修改上面的代码来做到这一点。谢谢
您可以使用 preg_match()
检查 $criteria 是否匹配 $value
。您可以根据正则表达式要求替换$criteria
(转义点,将?
转换为[.-]
):
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
)
你可以这样做:
function get_morse() {
return $morse_codes = 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"=>"----.",
"."=>".-.-.-",
","=>"--..--",
"?"=>"..--..",
"/"=>"-..-.",
" "=>" "
);
}
function possibilities($signals) {
$signals = str_replace(['.','?'],['\.','[.-]'],$signals);
$regexp = '~^'.$signals.'$~';
$morse_codes = get_morse();
$result = [];
foreach ($morse_codes as $key => $value) {
if (preg_match($regexp, $value)) {
$result[$value] = $key;
}
}
krsort($result);
return array_values($result);
}
我有一个函数可以检查字符串(参数)是否与数组中的值匹配,并且 return 是一个可能性数组键
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( ".-" );
将return [a]...等等
但问题在于,如果参数有一个未知的例子
find_possible_match("?");
应该return[e,t],同样
find_possible_match("?.")
应该return['i','n']和
find_possible_match(".?")
应该return['i','a']
?在这种情况下是通配符。 我如何修改上面的代码来做到这一点。谢谢
您可以使用 preg_match()
检查 $criteria 是否匹配 $value
。您可以根据正则表达式要求替换$criteria
(转义点,将?
转换为[.-]
):
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
)
你可以这样做:
function get_morse() {
return $morse_codes = 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"=>"----.",
"."=>".-.-.-",
","=>"--..--",
"?"=>"..--..",
"/"=>"-..-.",
" "=>" "
);
}
function possibilities($signals) {
$signals = str_replace(['.','?'],['\.','[.-]'],$signals);
$regexp = '~^'.$signals.'$~';
$morse_codes = get_morse();
$result = [];
foreach ($morse_codes as $key => $value) {
if (preg_match($regexp, $value)) {
$result[$value] = $key;
}
}
krsort($result);
return array_values($result);
}