多数大学生出来选择的工作和专业无关
首页 > 专业知识

PHP中接收复选框信息的方法

时间:2018-10-26 19:16:41 [来源]:郑州PHP培训学校

   PHP中接收复选框信息的方法

  PHP接收多个同名复选框信息不像ASP那样自动转换成为数组,这给使用带来了一定不便。但是还 是有解决办法的,就是利用javascript做一下预处理。多个同名复选框在javascript中还是以数组的 形式存在的,所以在表单提交之前可以利用javascript把复选框中的信息组合成一个字符数组赋值给 表单中的隐藏元素,然后用PHP中的explode函数解析此数组,这样就可以实现复选框信息的传递了。
  下面举例说明。
  假设有这样一个表单:
  <form name="form1" id="form1" method="post" action="myphp.php" onSubmit="return Checker()">
  <input type="checkbox" name="item" value="1">1<br>
  <input type="checkbox" name="item" value="2">2<br>
  <input type="checkbox" name="item" value="3">3<br>
  <input type="checkbox" name="item" value="4">4<br>
  <input type="hidden" name="items" value="">
  <input type="submit" value="Submit">
  </form>
  这个表单有四个名字都是item的复选框,当用户单击Submit按钮的时候,Checker函数会被调用,并且 如果Checker返回true表单就被提交,返回false表单就不会被提交。这里Checker函数就是我们要编写 的预处理函数。在HTML的header部分添加下面的javascript:
  <script language="javascript">
  <!--
  function Checker()
  {
  form1.items.value = "";
  if ( !form1.item.length ) // 只有一个复选框,form1.item.length = undefined{
  if ( form1.items.checked )
  form1.items.value = form1.item.value;
  }
  else
  {
  for ( i = 0 ; i < form1.item.length ; i++ ){
  if ( form1.item(i).checked ) // 复选框中有选中的框{
  form1.items.value = form1.item(i).value;
  for ( j = i + 1 ; j < form1.item.length ; j++ ){
  if ( form1.item(j).checked )
  {
  form1.items.value += " "; //用空格做分割符form1.items.value += form1.item(j).value;}
  }
  break;
  }
  }
  }
  return true;
  }
  -->
  </script>
  这样就可以把所有选中的复选框的value组合成为一个字符串数组,在myphp.php使用这样的语句:
  $items = explode(" ", $HTTP_POST_VARS["items"]);就可以把这些选项分离出来成为数组。需要注意的是选项中的value不能包含分割符(这里是空格)。
 
  php中匿名函数的使用
  php匿名函数的作用就是为了扩大函数的使用功能,在PHP 5.3以前,传递Callback的方式,我们只有两种选择:
  1、字符串的函数名
  2、使用create_function的返回
  在PHP5.3以后, 我们多了一个选择, 也就是Closure。
  1. $func = function () { ... };
  2. array_walk($arr, $func);
  从实现上来说, 第一种方式: 传递函数名字符串是最简单的。而第二种方式create_function, 其实和第一种方式本质上一样的, create_function返回一个字符串的函数名, 这个函数名的格式是:
  1. "\000_lambda_" . count(anonymous_functions)++我们来看看create_function的实现步骤:
  1. 获取参数, 函数体;
  2. 拼凑一个"function __lambda_func (参数) { 函数体;} "的字符串;3. eval;
  4. 通过__lambda_func在函数表中找到eval后得到的函数体, 找不到就出错;5. 定义一个函数名:"\000_lambda_" . count(anonymous_functions)++;6. 用新的函数名替换__lambda_func;
  7. 返回新的函数。
  我们来验证下:
  1. <?php
  2. create_function("", 'echo __FUNCTION__;');3. call_user_func("\000lambda_1", 1);
  4. ?>
  5. //输出
  6. __lambda_fun
  因为在eval的时候, 函数名是”__lambda_func”, 所以匿名函数内会输出__lambda_func, 而因为最后用”\000_lambda_”.count(anonymous_functions)++重命名了函数表中的”__lambda_func”函数, 所以可通过”\000_lambda_” . count(anonymous_functions)++调用这个匿名函数。为了证实这一点, 可以将create_function的返回值dump出来查看。
  而在PHP 5.3发布的时候, 其中有一条new feature就是支持闭包/Lambda Function, 我第一反应是以为zval新增了一个IS_FUNCTION, 但实际上是构造了一个PHP 5.3引入的Closure”类”的实例, Closure类的构造函数是私有的, 所以不能被直接实例化, 另外Closure类是Final类, 所以也不能做为基类派生子类.
  1. //php-5.3.0
  2. $class = new ReflectionClass("Closure");3. var_dump($class->isInternal());
  4. var_dump($class->isAbstract() );
  5. var_dump($class->isFinal());
  6. var_dump($class->isInterface());
  7. //输出:
  8. bool(true)
  9. bool(false)
  10. bool(true)
  11. bool(false)
  12. ?>
  而PHP 5.3中对闭包的支持, 也仅仅是把要保持的外部变量, 做为Closure对象的”Static属性”(并不是普通意义上的可遍历/访问的属性).
  1. //php-5.3.0
  2. $b = "laruence";
  3. $func = function($a) use($b) {};
  4. var_dump($func);
  5. /* 输出:
  6. object(Closure)#1 (2) {
  7. ["static"]=>
  8. array(1) {
  9. ["b"]=>
  10. string(8) "laruence"
  11. }
  12. ["parameter"]=>
  13. array(1) {
  14. ["$a"]=>
  15. string(10) "<required>"
  16. }
  17. }
  18. */
  这个实现, 个人认为和JS对闭包的支持比起来, 还是有些太简陋了。
 
  PHP中的正规表达式怎么用
   PHP继承*NIX的一贯传统,完全支持正规表达式的处理。正规表达式提供了一种高级的,但不直观的字符串匹配和处理的方法。用过PERL的正规表达式的朋友都知道,正规表达式的功能非常强大,但学起来不是那么容易。
  比如:
  ^.+@.+\\..+$
  这段有效却难以理解的代码足够使一些程序员头痛(我就是)或者让他们放弃使用正规表达式。相信当你读完这个教程后,就可以理解这段代码的含义了。
  基本模式匹配
  一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:
  ^once
  这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。
  bucket$
  这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:
  ^bucket$
  只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式once
  与字符串
  There once was a man from NewYork
  Who kept all of his cash in a bucket.
  是匹配的。
  在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠(\)打头。制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:
  ^\t
  类似的,用\n表示“新行”,\r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\\表示,句号.用\.表示,以此类推。
  字符簇
  在INTERNET的程序中,正规表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。
  所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:
  [AaEeIiOoUu]
  这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:
  [a-z] //匹配所有的小写字母
  [A-Z] //匹配所有的大写字母
  [a-zA-Z] //匹配所有的字母
  [0-9] //匹配所有的数字
  [0-9\.\-] //匹配所有的数字,句号和减号
  [ \f\r\t\n] //匹配所有的白字符
  同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式:
  ^[a-z][0-9]$
  尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。
  前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:
  ^[^0-9][0-9]$
  这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:
  [^a-z] //除了小写字母以外的所有字符
  [^\\\/\^] //除了(\)(/)(^)之外的所有字符
  [^\"\'] //除了双引号(")和单引号(')之外的所有字符特殊字符"." (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。
  PHP的正规表达式有一些内置的通用字符簇,列表如下:
  字符簇 含义
  [[:alpha:]] 任何字母
  [[:digit:]] 任何数字
  [[:alnum:]] 任何字母和数字
  [[:space:]] 任何白字符
  [[:upper:]] 任何大写字母
  [[:lower:]] 任何小写字母
  [[:punct:]] 任何标点符号
  [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]
 

上一篇:提升PHP速度全攻略都有哪些

下一篇:快速掌握PHP检查语法错误技巧