PHP用正则匹配form表单中所有元素的类型和属性值实例代码


Posted in PHP onFebruary 28, 2017

前言

最近工作中遇到一个需求,需要在正则匹配页面中,所有可能存在的 form 表单的元素,可能有 input,action,select,textarea等等所有可能的元素,本文给出一个代码示例。感兴趣的朋友们可以参考学习。

实例代码如下

假设页面 1.html 的网页源代码是:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="utf-8" />
 <title>一个含有 form 表单的登录注册页面</title>
 <style type="text/css">
 *{padding:0;margin:0;font-size:12px;}
 .tbl{margin:20px auto;border:1px solid #AACCEE;padding:30px 30px;border-radius:4px;}
 .tbl td{line-height:30px;vertical-align:top;}
 textarea{resize:none;height:60px;}
 </style>
 </head>
 <body>
 <form action="register.php" method="post">
 <input type="hidden" name="cookie" value="SJKjki80KJ8jkl2" />
 <table cellpadding="0" cellspacing="0" class="tbl"> 
 <tr>
 <th colspan="2">注册</th>
 </tr>
 <tr>
 <td>昵称:</td>
 <td><input type="text" name = 'name' required="" /></td>
 </tr>
 <tr>
 <td>密码:</td>
 <td><input name="password" type="password" required="required" /></td>
 </tr>
 <tr>
 <td>年龄:</td>
 <td><input name="age" value="22" required="required" ></td>
 </tr>
 <tr>
 <td>性别:</td>
 <td>
 <input type="radio" name="sex" value="1" /> 男
 <input type="radio" name="sex" value="0" /> 女
 </td>
 </tr>
 <tr>
 <td>地区:</td>
 <td>
 <select name="area">
 <option value="jiangsu">江苏</option>
 <option value="shandong">山东</option>
 <option value="fujian">福建</option>
 <option value="beijing">北京</option>
 </select>
 </td>
 </tr>
 <tr>
 <td>城市:</td>
 <td>
 <select name="city">
 <option value="qingdao">青岛</option>
 <option value="longyan">龙岩</option>
 <option value="beijing">北京</option>
 <option value="wuxi">无锡</option>
 </select>
 </td>
 </tr>
 <tr>
 <td>兴趣:</td>
 <td>
 <input type="checkbox" name="xingqu[]" value="1" > 篮球
 <input type="checkbox" name="xingqu[]" value="2"> 足球
 <input type="checkbox" name="xingqu[]" value="3" > 跳高
 </td>
 </tr>
 <tr>
 <td>照片:</td>
 <td><input type="file" name="photo" /></td>
 </tr>
 <tr>
 <td>简介:</td>
 <td><textarea name="summary" required="">这里填入个人简介</textarea></td>
 </tr>
 <tr>
 <td>备注:</td>
 <td><textarea name="remark" required="">1</textarea ></td>
 </tr>
 <tr>
 <td colspan="2"><input type="submit" name="register" value="注册"></td>
 </tr>
 </table> 
 </form>
 <form action="login.php" method="post">
 <table cellpadding="0" cellspacing="0" class="tbl">
 <tr>
 <th colspan="2">登录</th>
 </tr>
 <tr>
 <td>昵称:</td>
 <td><input type="text" name = 'name' required="required" /></td>
 </tr>
 <tr>
 <td>密码:</td>
 <td><input name="password" type="password" required="required" /></td>
 </tr>
 <tr>
 <td>备注:</td>
 <td><textarea name="remark" required="">2</textarea></td>
 </tr> 
 <tr>
 <td colspan="2"><input type="submit" name="register" value="登录"></td>
 </tr>
 </table> 
 </form> 
 </body>
</html>

我们需要获取到这个页面所有 form 表单,及每个 form 表单所包含的各类表单元素,例如:input,select,textarea等等。

匹配的源代码是:

$content = file_get_contents('1.html');
$arr_form = get_page_form_data($content);
if(empty($arr_form))
{
 echo '抱歉!未匹配到 form 表单元素';
}else
{
 foreach($arr_form as $k => $v)
 {
 echo 'form'.($k+1).':<br />';
 if(!empty($v['action']))
 {
 echo '----action:<br />';
 echo '--------'.$v['action'].'<br />';
 }
 if(!empty($v['method']))
 {
 echo '----method:<br />';
 echo '--------'.$v['method'].'<br />';
 } 
 if(!empty($v['inputs']))
 {
 echo '----inputs:<br />';
 foreach($v['inputs'] as $key => $value)
 {
 echo '--------name:'.$value['name'].' type:'.$value['type'].' value:'.$value['value'].'<br />';
 }
 } 
 if(!empty($v['textarea']))
 {
 echo '----textarea:<br />';
 foreach($v['textarea'] as $key => $value)
 {
 echo '--------name:'.$value['name'].' value:'.$value['value'].'<br />';
 }
 } 
 if(!empty($v['select']))
 {
 echo '----select:<br />';
 for($m = 0;$m < count($v['select']);$m ++)
 {
 echo '--------name:'.$v['select'][$m]['name'].'<br />';
 if(!empty($v['select'][$m]['option']))
 {
 foreach ($v['select'][$m]['option'] as $key => $value) 
 {
 echo '------------value:'.$value.'<br />';
 }
 }
 }
 }
 }
}
// 获取页面中的 form 表单中的所有 input、textarea 元素中 name、value、type 等属性值
function get_page_form_data($content)
{
 $arr_form = array();
 $form = regular_form_tags($content);
 for($i = 0;$i < count($form[0]);$i ++)
 {
 $arr_form[$i]['action'] = regular_form_action($form[1][$i]);
 $arr_form[$i]['method'] = regular_form_method($form[1][$i]);
 $input = regular_input_tags($form[2][$i]);
 for($j = 0;$j < count($input[0]);$j ++)
 {
 $arr_form[$i]['inputs'][$j]['name'] = regular_input_name($input[0][$j]);
 $arr_form[$i]['inputs'][$j]['type'] = regular_input_type($input[0][$j]);
 $arr_form[$i]['inputs'][$j]['value'] = regular_input_value($input[0][$j]);
 }
 $textarea = regular_textarea_tags($form[2][$i]);
 for($k = 0;$k < count($textarea);$k ++)
 {
 $arr_form[$i]['textarea'][$k]['name'] = regular_textarea_name($textarea[$k]);
 $arr_form[$i]['textarea'][$k]['value'] = regular_textarea_value($textarea[$k]);
 }
 $select = regular_select_tags($form[2][$i]);
 for($l = 0;$l < count($select[0]);$l ++)
 {
 $arr_form[$i]['select'][$l]['name'] = regular_select_name($select[1][$l]);
 $option = regular_option_tags($select[2][$l]);
 for($n = 0;$n < count($option[$l]);$n ++)
 {
 $arr_form[$i]['select'][$l]['option'][$n] = regular_option_value($option[$l][$n]);
 } 
 }
 }
 return $arr_form;
}
// 正则匹配 form 标签
function regular_form_tags($string)
{ 
 $pattern = '/<form(.*?)>(.*?)<\/form>/si'; 
 preg_match_all($pattern,$string,$result);
 return $result;
}
// 正则匹配 form 标签的 action 属性值
function regular_form_action($string)
{
 $pattern = '/action[\s]*?=[\s]*?([\'\"])(.*?)\1/';
 if(preg_match($pattern,$string,$result))
 {
 return $result[2];
 }
 return null;
}
// 正则匹配 form 标签的 method 属性值
function regular_form_method($string)
{
 $pattern = '/method[\s]*?=[\s]*?([\'\"])(.*?)\1/';
 if(preg_match($pattern,$string,$result))
 {
 return $result[2];
 }
 return null;
}
// 正则匹配 input 标签
function regular_input_tags($string)
{
 $pattern = '/<input.*?\/?>/si'; 
 if(preg_match_all($pattern,$string,$result))
 {
 return $result; 
 }
 return null;
}
// 正则匹配 input 标签的 name 属性值
function regular_input_name($string)
{
 $pattern = '/name[\s]*?=[\s]*?([\'\"])(.*?)\1/';
 if(preg_match($pattern,$string,$result))
 {
 return $result[2];
 }
 return null;
 
}
// 正则匹配 input 标签的 type 属性值
function regular_input_type($string)
{
 $pattern = '/type[\s]*?=[\s]*?([\'\"])(.*?)\1/';
 if(preg_match($pattern,$string,$result))
 {
 return $result[2];
 }
 return null;
}
// 正则匹配 input 标签的 value 属性值
function regular_input_value($string)
{
 $pattern = '/value[\s]*?=[\s]*?([\'\"])(.*?)\1/';
 if(preg_match($pattern,$string,$result))
 {
 return $result[2];
 }
 return null; 
}
// 正则匹配 textarea 标签
function regular_textarea_tags($string)
{
 $pattern = '/(<textarea.*?>.*?<\/textarea[\s]*?>)/si'; 
 if(preg_match_all($pattern,$string,$result))
 {
 return $result[1];
 }
 return null;
}
// 正则匹配 textarea 标签的 name 属性值
function regular_textarea_name($string)
{
 $pattern = '/name[\s]*?=[\s]*?([\'\"])(.*?)\1/si'; 
 if(preg_match($pattern,$string,$result))
 {
 return $result[2];
 }
 return null;
}
// 正则匹配 textarea 标签的 name 属性值
function regular_textarea_value($string)
{
 $pattern = '/<textarea.*?>(.*?)<\/textarea>/si'; 
 if(preg_match($pattern,$string,$result))
 {
 return $result[1];
 }
 return null;
}
// 正则匹配 select 标签
function regular_select_tags($string)
{
 $pattern = '/<select(.*?)>(.*?)<\/select[\s]*?>/si';
 preg_match_all($pattern,$string,$result);
 return $result;
}
// 正则匹配 select 标签的 option 子标签
function regular_option_tags($string)
{
 $pattern = '/<option(.*?)>.*?<\/option[\s]*?>/si';
 preg_match_all($pattern,$string,$result);
 return $result; 
}
// 正则匹配 select 标签的 name 属性值
function regular_select_name($string)
{
 $pattern = '/name[\s]*?=[\s]*?([\'\"])(.*?)\1/si';
 if(preg_match($pattern,$string,$result))
 {
 return $result[2];
 }
 return null;
}
// 正则匹配 select 的子标签 option 的 value 属性值
function regular_option_value($string)
{
 $pattern = '/value[\s]*?=[\s]*?([\'\"])(.*?)\1/si';
 if(preg_match($pattern,$string,$result))
 {
 return $result[2];
 }
 return null;
}

运行效果如下图所示:

PHP用正则匹配form表单中所有元素的类型和属性值实例代码

PHP用正则匹配form表单中所有元素的类型和属性值实例代码

这样我们就可以实现获取任意一个页面中的 form 表单所有存在的元素啦!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用PHP能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
第三节 定义一个类 [3]
Oct 09 PHP
PHP函数常用用法小结
Feb 08 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
apache mysql php 源码编译使用方法
May 03 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
浅谈PDO的rowCount函数
Jun 18 PHP
php删除数组中重复元素的方法
Dec 22 PHP
PHP使用SOAP扩展实现WebService的方法
Apr 01 PHP
php实现购物车功能(以大苹果购物网为例)
Mar 09 PHP
PHP中递归的实现实例详解
Nov 14 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
Feb 28 #PHP
PHP连接MYSQL数据库的3种常用方法
Feb 27 #PHP
php获取今日开始时间和结束时间的方法
Feb 27 #PHP
php+mysql+jquery实现日历签到功能
Feb 27 #PHP
php查找字符串中第一个非0的位置截取
Feb 27 #PHP
php实时倒计时功能实现方法详解
Feb 27 #PHP
php自定义截取中文字符串-utf8版
Feb 27 #PHP
You might like
详解:――如何将图片储存在数据库里
2006/12/05 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
2011/10/31 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
自己的js工具 Cookie 封装
2009/08/21 Javascript
jQuery 白痴级入门教程
2009/11/11 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
token 机制和实现方式
2020/12/15 Javascript
改进Django中的表单的简单方法
2015/07/17 Python
python读取二进制mnist实例详解
2017/05/31 Python
详解Django中间件执行顺序
2018/07/16 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
教师评优事迹材料
2014/01/10 职场文书
原材料检验岗位职责
2014/03/15 职场文书
主题班会演讲稿
2014/05/22 职场文书
教师专业技术工作总结2015
2015/05/13 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
创业计划书之书店
2019/09/10 职场文书