我试图找到最简单(或至少最短)的方法来完成以下任务:从输入字段中获取任何文本,并按如下所示进行转换:
abc => 2 def => 3 ghi => 4 ... wxyz => 9
这听起来可能很简单,但代码可以做得非常简单和优雅,这就是我正在寻找的,在PHP或JS/JQuery脚本中更少的行。如果它转换“abc”,“def”,我可以完成剩下的。
flseospp1#
构建一个关联数组,将AMap到2,将BMap到2,将CMap到2,将DMap到3,以此类推。迭代字符串,一次一个字符。如果在数组中找到字符,则将其连接到输出;如果没有,则将"#"连接到输出。您可能希望首先将字符串转换为全大写或全小写。编辑以添加:我没有包含代码,因为OP似乎了解JavaScript和PHP,当然,代码会有所不同,但原理是相同的。如果绝对肯定字符串是ASCII/UTF-8/ISO-8859格式的,那么可以利用大写字母占据十进制65到90的码位,并且从2到9的每个数字分配三个字母的事实来计算结果。(注意,美国电话中缺少Q,ZMap为零。)然而,这与其说是优雅,不如说是过于棘手。今天早些时候我想起了这件事:"调试比一开始写代码要难两倍。因此,如果你尽可能聪明地写代码,那么,从定义上讲,你还没有聪明到能调试它。"--Brian Kernighan和P.J. Plauger,《编程风格的要素》
ny6fqffe2#
可以使用str_replace($searchArr, $replaceArr, $string)将“search array”中的任何内容替换为“replacement array”中的相应值,并按如下方式填充这些数组:
str_replace($searchArr, $replaceArr, $string)
$string = "dhebfctgddekj"; $pattern = array(); $replacement = array(); for($i = 97; $i < 123; $i++) //Ascii 97 = a to ascii 122 = z { $pattern[] = chr($i); //Convert the ascii to a character } $r = array(3,3,3,3,3,4,3,4); //How many characters each number has $j = 2; foreach($r as $val) { for($i = 0; $i < $val; $i++) $replacement[] = $j; $j++; } $string2 = str_replace($pattern, $replacement, strtolower($string)); echo $string2;
lbsnaicq3#
$subject = '0900ABCDEF' $ReplacementPattern = array( 'a' => '2', 'b' => '2', 'c' => '2', 'd' => '3', 'e' => '3', 'f' => '3', 'g' => '4', 'h' => '4', 'i' => '4', 'j' => '5', 'k' => '5', 'l' => '5', 'm' => '6', 'n' => '6', 'o' => '6', 'p' => '7', 'q' => '7', 'r' => '7', 's' => '7', 't' => '8', 'u' => '8', 'v' => '8', 'w' => '9', 'x' => '9', 'y' => '9', 'z' => '9', '+' => '00', ' ' => '', ); echo str_ireplace(array_keys($ReplacementPattern), array_values($ReplacementPattern), $subject);
8mmmxcuj4#
javascript中的一行程序:
phoneStr.replace(/./g, x => '22233344455566677778889999'[(x.charCodeAt()-65)%32] || x );
如果你想更清楚,你可以做[x.toLowerCase().charCodeAt()-97]。演示(在适当命名的函数中粘贴):
[x.toLowerCase().charCodeAt()-97]
> phoneToKeypad('+1-800-abc-WXYZ') "+1-800-222-9999"
如果需要,还可以使用Array.from(phoneStr, x => x)处理Array表示,然后使用.join('')将其还原为字符串。通过预处理适当地去除脏输入(例如连字符、括号等):
Array.from(phoneStr, x => x)
.join('')
phoneStr.replace(/[^0-9*#+a-zA-Z]/g, '').replace( ... etcetc
当然,你需要在服务器端进行杀毒,所以你不能只依赖客户端的javascript(除非你的服务器也使用javascript)。小键盘的布局被称为ISO/IEC 9995-8。但是,请注意(根据我非常粗略的研究)有过多的国际标准,如欧洲的184页ETSI ES 202 130标准。
6uxekuva5#
下面是一个javascript函数,我用它来转换文本到电话键盘号码:
const textToKeypadNumber = (text) => { const phoneCharMap = { a: "2", b: "2", c: "2", d: "3", e: "3", f: "3", g: "4", h: "4", i: "4", j: "5", k: "5", l: "5", m: "6", n: "6", o: "6", p: "7", q: "7", r: "7", s: "7", t: "8", u: "8", v: "8", w: "9", x: "9", y: "9", z: "9", "+": "00", " ": "" }; const _text = text.split(""); return _text .map(char => { const number = phoneCharMap[char.toLowerCase()]; if (number) return phoneCharMap[char.toLowerCase()]; return char; }) .join(""); }
像这样使用:
textToKeypadNumber('1-800-MY-APPLE'); // 1-800-69-27753
ffscu2ro6#
为了遵守ISO/IEC 9995 - 8(这是我在本任务中想到的字母到数字的转换),PHP的strtr()将使用两个紧凑的字符串。如果小写字母是可能的,那么在翻译之前打电话给strtoupper(),但是每当我看到电话号码广告中的字母时,它们都是大写的。代码:(Demo)
strtr()
strtoupper()
$phone = '1300EXAMPLE'; echo strtr( $phone, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '22233344455566677778889999' ); // 13003926753
如果要将所有剩余的非数字值清理为#,则使用preg_replace():
#
preg_replace()
echo preg_replace( '/\D+/', '#', strtr( $phone, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', '22233344455566677778889999' ) );
6条答案
按热度按时间flseospp1#
构建一个关联数组,将AMap到2,将BMap到2,将CMap到2,将DMap到3,以此类推。
迭代字符串,一次一个字符。如果在数组中找到字符,则将其连接到输出;如果没有,则将"#"连接到输出。您可能希望首先将字符串转换为全大写或全小写。
编辑以添加:我没有包含代码,因为OP似乎了解JavaScript和PHP,当然,代码会有所不同,但原理是相同的。
如果绝对肯定字符串是ASCII/UTF-8/ISO-8859格式的,那么可以利用大写字母占据十进制65到90的码位,并且从2到9的每个数字分配三个字母的事实来计算结果。(注意,美国电话中缺少Q,ZMap为零。)然而,这与其说是优雅,不如说是过于棘手。
今天早些时候我想起了这件事:
"调试比一开始写代码要难两倍。因此,如果你尽可能聪明地写代码,那么,从定义上讲,你还没有聪明到能调试它。"--Brian Kernighan和P.J. Plauger,《编程风格的要素》
ny6fqffe2#
可以使用
str_replace($searchArr, $replaceArr, $string)
将“search array”中的任何内容替换为“replacement array”中的相应值,并按如下方式填充这些数组:lbsnaicq3#
8mmmxcuj4#
javascript中的一行程序:
如果你想更清楚,你可以做
[x.toLowerCase().charCodeAt()-97]
。演示(在适当命名的函数中粘贴):
如果需要,还可以使用
Array.from(phoneStr, x => x)
处理Array表示,然后使用.join('')
将其还原为字符串。通过预处理适当地去除脏输入(例如连字符、括号等):
当然,你需要在服务器端进行杀毒,所以你不能只依赖客户端的javascript(除非你的服务器也使用javascript)。
小键盘的布局被称为ISO/IEC 9995-8。但是,请注意(根据我非常粗略的研究)有过多的国际标准,如欧洲的184页ETSI ES 202 130标准。
6uxekuva5#
下面是一个javascript函数,我用它来转换文本到电话键盘号码:
像这样使用:
ffscu2ro6#
为了遵守ISO/IEC 9995 - 8(这是我在本任务中想到的字母到数字的转换),PHP的
strtr()
将使用两个紧凑的字符串。如果小写字母是可能的,那么在翻译之前打电话给
strtoupper()
,但是每当我看到电话号码广告中的字母时,它们都是大写的。代码:(Demo)
如果要将所有剩余的非数字值清理为
#
,则使用preg_replace()
: