php 根据电话键盘将电话号码中的字母转换为数字

ego6inou  于 2023-01-29  发布在  PHP
关注(0)|答案(6)|浏览(247)

我试图找到最简单(或至少最短)的方法来完成以下任务:
从输入字段中获取任何文本,并按如下所示进行转换:

abc => 2
def => 3
ghi => 4
...
wxyz => 9
  • 任何其他不属于英语字母表的字符都将转换为“#”(或任何其他特殊字符)。

这听起来可能很简单,但代码可以做得非常简单和优雅,这就是我正在寻找的,在PHP或JS/JQuery脚本中更少的行。如果它转换“abc”,“def”,我可以完成剩下的。

flseospp

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,《编程风格的要素》

ny6fqffe

ny6fqffe2#

可以使用str_replace($searchArr, $replaceArr, $string)将“search array”中的任何内容替换为“replacement array”中的相应值,并按如下方式填充这些数组:

$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;
lbsnaicq

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);
8mmmxcuj

8mmmxcuj4#

javascript中的一行程序:

phoneStr.replace(/./g, x => 
    '22233344455566677778889999'[(x.charCodeAt()-65)%32] || x
);

如果你想更清楚,你可以做[x.toLowerCase().charCodeAt()-97]
演示(在适当命名的函数中粘贴):

> phoneToKeypad('+1-800-abc-WXYZ')
"+1-800-222-9999"

如果需要,还可以使用Array.from(phoneStr, x => x)处理Array表示,然后使用.join('')将其还原为字符串。
通过预处理适当地去除脏输入(例如连字符、括号等):

phoneStr.replace(/[^0-9*#+a-zA-Z]/g, '').replace( ... etcetc

当然,你需要在服务器端进行杀毒,所以你不能只依赖客户端的javascript(除非你的服务器也使用javascript)。
小键盘的布局被称为ISO/IEC 9995-8。但是,请注意(根据我非常粗略的研究)有过多的国际标准,如欧洲的184页ETSI ES 202 130标准。

6uxekuva

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
ffscu2ro

ffscu2ro6#

为了遵守ISO/IEC 9995 - 8(这是我在本任务中想到的字母到数字的转换),PHP的strtr()将使用两个紧凑的字符串。
如果小写字母是可能的,那么在翻译之前打电话给strtoupper(),但是每当我看到电话号码广告中的字母时,它们都是大写的。
代码:(Demo

$phone = '1300EXAMPLE';
echo strtr(
         $phone,
         'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
         '22233344455566677778889999'
     );
// 13003926753

如果要将所有剩余的非数字值清理为#,则使用preg_replace()

echo preg_replace(
         '/\D+/',
         '#',
         strtr(
             $phone,
             'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
             '22233344455566677778889999'
         )
     );

相关问题