Chinaunix

标题: [正则]谁能给个把全角数字12345转为半角数字12345的函数表达式? [打印本页]

作者: qingmedia    时间: 2005-11-29 14:37
标题: [正则]谁能给个把全角数字12345转为半角数字12345的函数表达式?
用途是这样的,比如电话号码:

我们要求的是:010-24356987
但有时候客户输入的是:010-24356987

我看一些利用js判断输入的数字是否正确,否则提示要用户重新输入,但真有菜鸟连半角也不了解,所以他老是过不了关 。

我想,不如改成允许输入010-24356987(甚至“一二三四五”都可以),在服务器端用正则把数据变为010-24356987,这样皆大欢喜。我的想法应该不错吧?哈哈哈哈......

但烦请大伙给一个实现代码用用

[ 本帖最后由 HonestQiao 于 2005-11-29 14:45 编辑 ]
作者: HonestQiao    时间: 2005-11-29 14:44
http://w.yi.org/ftp/FAPM/PHP/php_manual_zh/function.preg-replace.html
  1. <?php
  2. // $document 应包含一个 HTML 文档。
  3. // 本例将去掉 HTML 标记,javascript 代码
  4. // 和空白字符。还会将一些通用的
  5. // HTML 实体转换成相应的文本。

  6. $search = array ("一","二","三");                  

  7. $replace = array ("1","2","3");

  8. $text = preg_replace ($search, $replace, $document);
  9. ?>
复制代码

作者: HonestQiao    时间: 2005-11-29 14:47
$search = explode(", "一,二,三");                  

$replace = explode(", "1,2,3");
作者: 夜猫子    时间: 2005-11-29 14:50
用乔老大的代码就可以搞定,但是需要注意全角的字符串是有编码的,有时候需要注意,不过在大多数的情况下,应该没有问题
作者: qingmedia    时间: 2005-11-29 15:17
原帖由 夜猫子 于 2005-11-29 14:50 发表
用乔老大的代码就可以搞定,但是需要注意全角的字符串是有编码的,有时候需要注意,不过在大多数的情况下,应该没有问题


哦,好的,多谢乔老大和夜猫子。
作者: qingmedia    时间: 2005-11-29 16:00
搞定了,必须要加上/才行:
$patterns = array (
    "/1/",
    "/2/",
    "/3/",
    "/4/",
    "/5/"     
    );
$replacements = array (
    "1",
    "2",
    "3",
    "4",
    "5"     
    );
作者: dz902    时间: 2005-11-29 16:25
可以用 str_replace 么?也是支持 array 的。
作者: 夜猫子    时间: 2005-11-29 17:17

  1. // 全角替换成半角
  2. function qj2bj($string){
  3.     $qj2bj = array(
  4.         '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5',
  5.         '6' => '6', '7' => '7', '8' => '8', '9' => '9', '0' => '0',
  6.         'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'e' => 'e',
  7.         'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 'j' => 'j',
  8.         'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n', 'o' => 'o',
  9.         'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's', 't' => 't',
  10.         'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x', 'y' => 'y',
  11.         'z' => 'z', 'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D',
  12.         'E' => 'E', 'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I',
  13.         'J' => 'J', 'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N',
  14.         'O' => 'O', 'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S',
  15.         'T' => 'T', 'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X',
  16.         'Y' => 'Y', 'Z' => 'Z', ' ' => ' '
  17.     );

  18.     return strtr($string, $qj2bj);
  19. }

  20. echo qj2bj('1A2B');
复制代码

作者: qingmedia    时间: 2005-11-29 17:59
原帖由 夜猫子 于 2005-11-29 17:17 发表
[code]
// 全角替换成半角
function qj2bj($string){
    $qj2bj = array(
        '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5',
        '6' => '6', '7' => ...


哈哈,这个简洁好用。
作者: hightman    时间: 2005-11-29 22:16
耍酷了,我也发一个,一句话,比较全,也能替换大部分全角符号为半角符号,不支持汉字数字替换.

但在效率上没有过多的考虑,有兴趣的可以比较试试,代码如下:


  1. $str = "0123ABC\",.?<>{}[]*&^%#@!~()+-|:;";
  2. $str = preg_replace('/\xa3([\xa1-\xfe])/e', 'chr(ord(\1)-0x80)', $str);
复制代码


效率说明, 如果程序中调用次数 < 10次,用正则比用 strtr 没有明显的效率差别,当次数越来越多时,用正则的方式效率将明显落后于 strtr(), 主要原因是正则替换每次都需要建立一个"引擎",呵呵.

[ 本帖最后由 hightman 于 2005-11-29 22:21 编辑 ]
作者: HonestQiao    时间: 2005-11-29 23:14
原帖由 hightman 于 2005-11-29 22:16 发表
耍酷了,我也发一个,一句话,比较全,也能替换大部分全角符号为半角符号,不支持汉字数字替换.

但在效率上没有过多的考虑,有兴趣的可以比较试试,代码如下:

[code]
$str = "0123ABC\", ...


这个还要看是NFSA还是DFSA,NFSA一般化费时间多一些。
作者: HonestQiao    时间: 2005-11-29 23:19
提供一个js或者vs版本的,绝对好用,把下面的代码直接拷贝到test.html,查看就可以看到绝好的实际效果。
  1. <script>
  2. /*
  3. ****************************
  4. *     半角<=>全角    *
  5. * [NB联盟] *
  6. * Writer YuPing *
  7. ****************************
  8. * 参数说明:
  9. * str:要转换的字符串
  10. * flag:标记,为0时半转全,为非0时全转半
  11. * 返回值类型:字符串
  12. ****************************
  13. */
  14. function DBC2SBC(str,flag) {
  15. var i;
  16. var result='';
  17. if (str.length<=0) {alert('字符串参数出错');return false;}
  18. for(i=0;i<str.length;i++)
  19. { str1=str.charCodeAt(i);
  20. if(str1<125&&!flag)
  21. result+=String.fromCharCode(str.charCodeAt(i)+65248);
  22. else
  23. result+=String.fromCharCode(str.charCodeAt(i)-65248);
  24. }
  25. return result;
  26. }
  27. //示例:
  28. alert(DBC2SBC("AAabc",0));
  29. document.write(DBC2SBC("abcdefg",0))
  30. </script>
  31. <input type=text value="abcdefg" id=txt><input type=button value="变" onclick=txt.value=DBC2SBC(txt.value)>


  32. <script language="vbscript">
  33. '****************************
  34. '*     半角<=>全角    *
  35. '* [NB联盟] *
  36. '* Writer YuPing *
  37. '****************************
  38. '* 参数说明:
  39. '* str:要转换的字符串
  40. '* flag:标记,为0时半转全,为非0时全转半
  41. '* 返回值类型:字符串
  42. '****************************
  43. function DBC2SBC(str,flag)
  44. dim i
  45. if len(str)<=0 then
  46. msgbox '字符串参数出错'
  47. exit function
  48. end if
  49. for i=1 to len(str)
  50. str1=asc(mid(str,i,1))
  51. if str1>0 and str1<=125 and not flag then
  52. dbc2sbc=dbc2sbc&chr(asc(mid(str,i,1))-23680)
  53. else
  54. dbc2sbc=dbc2sbc&chr(asc(mid(str,i,1))+23680)
  55. end if
  56. next
  57. end function
  58. '示例:
  59. alert(dbc2sbc("AB",1))
  60. </script>
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2