《细说php》这本书应该是每个php程序员入门的必读书籍,里面讲的很多知识都很系统和详细,看了正则这部分,并练习了里面的案例,发现自己已经会了很多。。。。

  1. header('Content-type:text/html;charset=utf8;');
  2.  
  3. /**
  4. * 正则表达式的几个函数
  5. * preg_match(, subject)
  6. * preg_match_all(pattern, subject, matches)
  7. * preg_replace(pattern, replacement, subject)
  8. * preg_replace_callback(pattern, callback, subject)
  9. * preg_split(pattern, subject)
  10. * preg_grep(pattern, input)
  11. *
  12. */
  13.  
  14. /**
  15. * 正则表达式组成: 定界符+原子+元字符+模式修正符
  16. *
  17. */
  18.  
  19. /**
  20. * 原子之通用字符类型
  21. * \d [0-9]
  22. * \D [^0-9]
  23. * \s [\f\r\n\v]
  24. * \S [^\f\r\t\n\v]
  25. * \w [0-9a-zA-Z]
  26. * \W [^0-9a-zA-Z]
  27. */
  28.  
  29. /*$str = '89898989@qq.cofds';
  30.  
  31. $pattern = '/^\w+@\w+(\.\w+){2,6}$/i';*/
  32.  
  33. /*$str = 'ab';
  34. $pattern = '/a\w{1,3}b/';*/
  35.  
  36. /**
  37. * 元字符
  38. * * 0或多次 t > 0
  39. * + 1次或多次 t > 1
  40. * ? 0次或1次 0 <= t <=1
  41. * . 除了换行符以外的任意字符
  42. * | 匹配两个或多个分支
  43. * {n} t = n
  44. * {n,} t > n
  45. * {n,m} n < t < m
  46. * ^ 开头
  47. * $ 结尾
  48. * []
  49. * [^]
  50. * () 模式单元, 大原子
  51. */
  52.  
  53. /**
  54. * 后向引用
  55. *
  56. */
  57. /*$str = '2008-12-24';
  58. // $pattern = '/^\d{4}\W\d{2}\W\d{2}$/';
  59. $pattern = '/^\d{4}(\W)\d{2}\\1\d{2}$/'; */
  60.  
  61. $str = 'WinLinuxOs';
  62. $pattern = '/([Win])([Linux])\\2Os/';
  63.  
  64. if (preg_match($pattern, $str,$matches)) {
  65.  
  66. echo '匹配正确!!!';
  67.  
  68. } else {
  69. echo '匹配失败!!';
  70. }
  71. print_r($matches);
  1. /**
  2. * +----------------------------------
  3. * | 字符串的匹配与查找
  4. * +----------------------------------
  5. */
  6. /**
  7. * +------------------------------------------------------
  8. * | preg_match(pattern, subject)
  9. * +------------------------------------------------------
  10. */
  11.  
  12. /*$str = '网址为http://www.erhameng.com/index.php的网址是二哈萌站点';
  13.  
  14. $pattern = '/(https?|ftps?):\/\/(www).([^\.\/]+)\.(com|cn\net)(\/[\w-\.\/\?\%\&\=]*)?/i';
  15.  
  16. if (preg_match($pattern, $str, $matchs)) {
  17. echo '匹配成功!!';
  18. } else {
  19. echo '匹配失败!!';
  20. }
  21.  
  22. print_r($matchs);*/
  23.  
  24. // preg_match_all(pattern, subject, matches)
  25.  
  26. /*$str = '网址为http://www.erhameng.com/index.php的网址是二哈萌站点
  27. 网址为http://baidu.com/b.php的网址是百度的站点
  28. 网址为http://www.google.com/g.php的网址是谷歌的站点
  29. ';
  30.  
  31. $pattern = '/(https?|ftps?):\/\/(www\.)?([^\.\/]+)\.(com|cn|net)(\/[\w-\.\/\?\%\&\=]*)?/i';
  32. $i=1;
  33. if (preg_match_all($pattern, $str, $matchs, PREG_SET_ORDER)) {
  34. foreach ($matchs as $k => $v) {
  35. echo "搜索到第{$i}个网址:" . $v[0] . '<br />';
  36. echo "搜索到第{$i}个协议:" . $v[1] . '<br />';
  37. echo "搜索到第{$i}个主机:" . $v[2] . '<br />';
  38. echo "搜索到第{$i}个域名:" . $v[3] . '<br />';
  39. echo "搜索到第{$i}个顶域:" . $v[4] . '<br />';
  40. echo "搜索到第{$i}个文件:" . $v[5] . '<br />';
  41. $i++;
  42. }
  43. } else {
  44. echo '匹配失败!!';
  45. }
  46.  
  47. print_r($matchs);*/
  48.  
  49. /**
  50. * +-----------------------------------------------
  51. * | 函数 preg_grep(pattern, input)
  52. * +-----------------------------------------------
  53. */
  54.  
  55. /*
  56. $array = array('Linux Redhat9.0', 'Apache2.2.9','Mysql5.5','PHP5.2.6','LAMP',100);
  57.  
  58. $pattern = '/^[a-zA-Z]+(\d|\.)+$/';
  59.  
  60. $version = preg_grep($pattern, $array);
  61.  
  62. print_r($version);
  63. */
  64.  
  65. /**
  66. * +------------------------------------------------------
  67. * | preg_replace(pattern, replacement, subject)
  68. * +------------------------------------------------------
  69. */
  70. //
  71.  
  72. // 1,去除html标签
  73. /*$pattern = '/<[\/\!]*?[^<>]*?>/is';
  74.  
  75. $str = '这个文本中有<b>粗体</b>和<u>带有下划线</u>以及<i>斜体</i>还有<font color="red">带有颜色的字体</font>的标记';
  76.  
  77. preg_match_all($pattern, $str, $matchs);
  78.  
  79. print_r($matchs);*/
  80. //echo preg_replace($pattern, "", $str);
  81.  
  82. // 2,日期格式的正则
  83. //$pattern = '/(\d{2})\/(\d{2})\/(\d{4})/';
  84.  
  85. //$str = '今年国庆节10/01/2017到10/07/2017放假共7天';
  86.  
  87. // echo preg_replace($pattern, "\\3-\\1-\\2", $str);
  88.  
  89. //echo preg_replace($pattern, "\${3}-\${1}-\${1}", $str);
  90.  
  91. /*$pattern = '/(<\/?)(\w+)([^>]*>)/e';
  92.  
  93. $str = '这个文本中有<b>粗体</b>和<u>带有下划线</u>以及<i>斜体</i>还有<font color="red">带有颜色的字体</font>的标记';
  94.  
  95. echo preg_replace($pattern, "'\\1'.strtoupper('\\2'). '\\3'", $str);*/
  96.  
  97. /**
  98. * +------------------------------------------------------
  99. * | str_replace(search, replace, subject),可以替换字符串和数组
  100. * +------------------------------------------------------
  101. */
  102.  
  103. /*$str = 'LAMP是目前最流行的web开发平台;<br>
  104. LAMP是b/s架构的黄金组合;<br>
  105. LAMP每个成员都是开源的;<br>
  106. LAMP的开源社区是php.net
  107. ';
  108. echo str_replace('LAMP', 'Linux apache mysql php', $str, $count) . $count;*/
  109.  
  110. /**
  111. * +------------------------------------------------------
  112. * | preg_split(pattern, subject) 正则分割
  113. * +------------------------------------------------------
  114. */
  115.  
  116. $words = preg_split('/([\s,]+)/', 'hello newyork city comming here');
  117. print_r($words);

案例:文章发布

artichle.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>文章发布</title>
  6. </head>
  7. <body>
  8. <form method="post" action="viewthread.php" target="_blank">
  9. <h2 align="center">发表文章演示</h2>
  10. <!-- 下面定义一组选项,使用样式表将其输入在左边 -->
  11. <div style="width:200; float:left">
  12. <h5>选项</h5>
  13. <ul style="list-style:none;margin:0px;padding:0px">
  14. <li><input type="checkbox" name="parse[]" value="1"> 删除HTML标签</li>
  15. <li><input type="checkbox" name="parse[]" value="2"> 转换HTML标签为实体</li>
  16. <li><input type="checkbox" name="parse[]" value="3"> 使用UBB代码</li>
  17. <li><input type="checkbox" name="parse[]" value="4"> 开启URL识别</li>
  18. <li title="可用的表情:
  19. 【:), /wx, 微笑】【:@, /fn, 发怒】
  20. 【:kiss, /kill,/sa,示爱】
  21. 【:p, /tx, 偷笑】【:q, /dk, 大哭】">
  22. <input type="checkbox" name="parse[]" value="5"> 使用表情</li>
  23. <li><input type="checkbox" name="parse[]" value="6"> 禁用非法关键字</li>
  24. <li><input type="checkbox" name="parse[]" value="7"> PHP代码设为高亮</li>
  25. <li><input type="checkbox" name="parse[]" value="8"> 原样显示</li>
  26. <li><input type="checkbox" name="parse[]" value="9"> 同步换行</li>
  27. </ul>
  28. </div>
  29. <!-- 下面定义文章的标题和文章内容的输入框,使用样式表取消换行在右边显示 -->
  30. <div style="width:300; float:left">
  31. <h5>标题<input type="text" name="subject" size=50></h5>
  32. <h5>内容<textarea rows="7" cols="50" name="message"></textarea></h5>
  33. <input type="submit" name="replysubmit" value="发表帖子">
  34. </div>
  35. </form>
  36. </body>
  37. </html>

viewthread.php

  1. <?php
  2. /**
  3. file: viewthread.php
  4. 文章处理脚本
  5. */
  6. //包含脚本文件acticle.class.php,将文章类导入该文件
  7. require "acticle.class.php";
  8. //创建一个文章对象,在构造方法中传入文章的标题,文章的主体内容以及用户的操作选项
  9. $article = new Acticle($_POST["subject"], $_POST["message"],$_POST["parse"]);
  10. //调用文章对象中的获取标题方法,输出文件的标题
  11. echo $article->getSubject();
  12. echo "<hr>"; //输出一个分隔线,用来分隔文章的标题和主体内容
  13. echo $article->getMessage(); //调用文章对象中的获取文章内容的方法,输出文章的主体内容

article.class.php

  1. <?php
  2. /**
  3. file:article.class.php
  4. 声明一个文章类,其中有两个成员属性标题和内容,如果需要还可以更多
  5. */
  6. class Acticle {
  7. private $subject; //文章的标题成员属性
  8. private $message; //文章的主本内容成员属性
  9.  
  10. //构造方法,通过传入文章标题和文章主体和文章的操作选项数组创建文章对象
  11. function __construct($subject=" ",$message=" ", $parse=array()) {
  12. //为文章标题赋初值,将HTML标记转为实体
  13. $this->subject = $this->html2Text($subject);
  14.  
  15. if(!empty($parse)) { //如果用户选择了对文章的操作选项则条件成功
  16. foreach($parse as $value) { //用户选择了几个文章操作选项则循环几次
  17. switch($value) { //根据用户选择的不同选项,调用不同的内部方法处理
  18. case 1: //如果用户选择“删除HTML标签”选项时条件成立
  19. $message = $this->delHtmlTags($message); break;
  20. case 2: //如果选择“转换HTML标签为实体”选项时条件成立
  21. $message = $this->html2Text($message); break;
  22. case 3: //如果用户选择“使用UBB代码”选项时条件成立
  23. $message = $this->UBBCode2Html($message); break;
  24. case 4: //如果用户选择“开启URL识别”选项时条件成立
  25. $message = $this->parseURL($message); break;
  26. case 5: //如果用户选择“使用表情”选项时条件成立
  27. $message = $this->parseSmilies($message); break;
  28. case 6: //如果用户选择“禁用非法关键字”选项时条件成立
  29. $message = $this->disableKeyWords($message); break;
  30. case 7: //如果用户选择“PHP代码设为高亮”选项时条件成立
  31. $message = $this->prasePHPCode($message); break;
  32. case 8: //如果用户选择“原样显示”选项时条件成立
  33. $message = $this->prasePer($message); break;
  34. case 9: //如果用户选择“同步换行”选项时条件成立
  35. $message = $this->nltobr($message); break;
  36. }
  37. }
  38. }
  39. //给成员属性$message赋初值
  40. $this->message = $message;
  41. }
  42.  
  43. //此私有方法有来删除HTML标记
  44. private function delHtmlTags($message) {
  45. //调用字符串处理函数删除HTML标记
  46. return strip_tags($message);
  47. }
  48.  
  49. //此私有方法有来将HTML标记转为HTML实体
  50. private function html2Text($message) {
  51. //调用字符串处理函数进行操作
  52. return htmlSpecialChars(stripSlashes($message));
  53. }
  54.  
  55. //此私有方法有来解析UBB代码
  56. private function UBBCode2Html($message) {
  57. //声明正则表达式的模板数组
  58. $pattern = array(
  59. '/\[b\]/i', '/\[\/b\]/i', '/\[i\]/i',
  60. '/\[\/i\]/i', '/\[u\]/i', '/\[\/u\]/i',
  61. '/\[font=([^\[\<]+?)\]/i',
  62. '/\[color=([#\w]+?)\]/i',
  63. '/\[size=(\d+?)\]/i',
  64. '/\[size=(\d+(\.\d+)?(px|pt|in|cm|mm|pc|em|ex|%)+?)\]/i',
  65. '/\[align=(left|center|right)\]/i',
  66. '/\[url=www.([^\["\']+?)\](.+?)\[\/url\]/is',
  67. '/\[url=(https?|ftp|gopher|news|telnet){1}:\/\/([^\["\']+?)\](.+?)\[\/url\]/is',
  68. '/\[email\]\s*([a-z0-9\-_.+]+)@([a-z0-9\-_]+[.][a-z0-9\-_.]+)\s*\[\/email\]/i',
  69. '/\[email=([a-z0-9\-_.+]+)@([a-z0-9\-_]+[.][a-z0-9\-_.]+)\](.+?)\[\/email\]/is',
  70. '/\[img\](.+?)\[\/img\]/',
  71. '/\[\/color\]/i', '/\[\/size\]/i', '/\[\/font\]/i','/\[\/align\]/'
  72. );
  73.  
  74. //声明正则表达式的替换数组
  75. $replace = array(
  76. '<b>', '</b>', '<i>',
  77. '</i>', '<u>', '</u>',
  78. '<font face="\\1">',
  79. '<font color="\\1">',
  80. '<font size="\\1">',
  81. '<font style=\"font-size: \\1\">',
  82. '<p align="\\1">',
  83. '<a href="http://www.\\1" target="_blank">\\2</a>',
  84. '<a href="\\1://\\2" target="_blank">\\3</a>',
  85. '<a href="mailto:\\1@\\2">\\1@\\2</a>',
  86. '<a href="mailto:\\1@\\2">\\3</a>',
  87. '<img src="\\1">',
  88. '</font>', '</font>', '</font>', '</p>'
  89. );
  90. //调用正则表达式的替换函数
  91. return preg_replace($pattern, $replace, $message);
  92. }
  93.  
  94. //此私有方法用来剪切长的URL,并加上链接
  95. private function cuturl($url) {
  96. $length = 65;
  97. $url = substr(strtolower($url), 0, 4) == 'www.' ? "http://$url" : $url;
  98. $urllink = "<a href=\"".$url.'" target="_blank">';
  99. //如果URL长度大于65则剪切
  100. if(strlen($url) > $length) {
  101. $url = substr($url, 0, intval($length * 0.5)).' ... '.substr($url, - intval($length * 0.3));
  102. }
  103. $urllink .= $url.'</a>';
  104. return $urllink;
  105. }
  106.  
  107. //此私有方法用来解析URL,将其加上链接
  108. private function parseURL($message) {
  109. $urlPattern = "/(www.|https?:\/\/|ftp:\/\/|news:\/\/|telnet:\/\/){1}([^\[\"']+?)(com|net|org)(\/[\w-\.\/\?\%\&\=]*)?/ei";
  110. return preg_replace($urlPattern, "\$this->cuturl('\\1\\2\\3\\4')", $message);
  111. }
  112.  
  113. //此方法用来解析表情
  114. private function parseSmilies($message) {
  115. //声明表情的正则表达式模板数组
  116. $pattern = array(
  117. '/:\)|\/wx|微笑/i',
  118. '/:@|\/fn|发怒/i',
  119. '/:kiss|\/kill|\/sa|示爱/',
  120. '/:p|\/tx|偷笑/i',
  121. '/:q|\/dk|大哭/i'
  122. );
  123.  
  124. //声明表情的替换数组
  125. $replace = array(
  126. '<img src="smilies/smile.gif" alt="微笑">',
  127. '<img src="smilies/huffy.gif" alt="发怒">',
  128. '<img src="smilies/kiss.gif" alt="示爱">',
  129. '<img src="smilies/titter.gif" alt="偷笑">',
  130. '<img src="smilies/cry.gif" alt="大哭">'
  131. );
  132.  
  133. //调用正则表达式的替换函数
  134. return preg_replace($pattern, $replace, $message);
  135. }
  136.  
  137. //此方法用来屏蔽文章中的非法关键字
  138. private function disableKeyWords($message) {
  139. $keywords_disable = array("非法关键字一", "非法关键字二", "非法关键字三");
  140. return str_replace($keywords_disable, "**", $message);
  141. }
  142.  
  143. //此方法用来将PHP代码设置为高亮
  144. private function prasePHPCode($message) {
  145. $pattern = '/(<\?.*?\?>)/ise';
  146. $replace = '"<pre style=\"background:#ddd\">".highlight_string("\\1",true)."</pre>"';
  147. return preg_replace($pattern, $replace, $message);
  148. }
  149.  
  150. //此方法用来将文章原样输出,即加上<pre>标记
  151. private function prasePer($message) {
  152. return '<pre>'.$message.'</pre>';
  153. }
  154.  
  155. //此私有方法用来将换行符号转为<br>标记
  156. private function nltobr($message) {
  157. //调用字符串处理函数nl2br()
  158. return nl2br($message);
  159. }
  160.  
  161. //此方法为公有的,返回文章的标题
  162. public function getSubject() {
  163. return '<h1 align=center>'.$this->subject.'</h1>';
  164. }
  165.  
  166. //此方法为公有的,返回文章的主体内容
  167. public function getMessage() {
  168. return $this->message;
  169. }
  170. }

发布文章测试输入文字:

[b]快快快[/b][size=7][size=8ex][color=#ddd]这行文字[/color][/size][align=center]这是一个p测试[/align]
[url=http://www.baidubaiduab.com]百度[/url]
[url=http://www.fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.com]这个链接非常长将被拦腰折断[/url]<br>
/wx发怒大哭 <br>我操了他妈的<br>
<?php echo phpinfo();?><br>
this man is \n foo

 

细说php2[正则表达式学习笔记]的更多相关文章

  1. JavaScript正则表达式学习笔记(二) - 打怪升级

    本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...

  2. javascript正则表达式 - 学习笔记

    JavaScript 正则表达式 学习笔记 标签(空格分隔): 基础 JavaScript 正则表达式是用于匹配字符串中字符组合的模式.在javascript中,正则表达式也是对象.这些模式被用于Re ...

  3. 小菜鸡学习---<正则表达式学习笔记2>

    正则表达式学习笔记2 一.修饰符 前面我们学习的都是用于匹配的基本的关键的一些表达式符号,现在我们来学习修饰符.修饰符不写在正则表达式里,修饰符位于表达式之外,比如/runoob/g,这个最后的g就是 ...

  4. 正则表达式学习笔记(附:Java版示例代码)

    具体学习推荐:正则表达式30分钟入门教程 .         除换行符以外的任意字符\w      word,正常字符,可以当做变量名的,字母.数字.下划线.汉字\s        space,空白符 ...

  5. python re库的正则表达式学习笔记

    1. 安装 默认已经安装好了python环境了 re库是python3的核心库,不需要pip install,直接import就行 2. 最简单的模式 字符本身就是最简单的模式 比如:'A', 'I ...

  6. delphi正则表达式学习笔记(一)

    在 Delphi 中是没有自带的正则表达式库的,在网上能找到的用于 Delphi 的正则表达式类大体上有两个,分别是 PerlRegEx 和 RegExpr. 前者相当强大,但发布程序时需要带上他的一 ...

  7. Python3正则表达式学习笔记

    学习前准备:导入re模块 import re 一.re的核心函数 1 - re.compile(pattern[, flags]) 编译正则表达式,速度快 2 - re.match(pattern, ...

  8. javascript笔记——正则表达式学习笔记

    indexof 查找 substring 获取字符串 [) charAt 获取某个字符 split 分割字符串,获得数组 \s:空格 \S:非空格 \d:数字 \D:非数字 \w:字符 \W:非字符 ...

  9. python 正则表达式 学习笔记(不断补充ing)

    本文参考了以下博客,感谢众位大神的分享! http://www.oschina.net/question/12_9507 和 http://www.crifan.com/python_re_sub_d ...

随机推荐

  1. JSON 与 XML 的比较 - iOS

    在与 web 服务进行数据交换的时候,通常支持两种主要的数据格式(即:JavaScript 对象表示法 JSON 与可扩展标记语言 XML),两者在可读性上都不分高下,接下来对此进行简单的总结和分析, ...

  2. react中密码自动填充及解决火狐浏览器,360浏览器记住密码后,密码框自动填充终极解决方案

    先直接上核心代码如下: 在火狐浏览器,360浏览器,初次加载,bug长这样: 如果你想通过生命周期componentDidMounted等生命周期进行置空操作都是不行的,这可能是浏览器自带的特性记住密 ...

  3. 安装阿里云版Linux云服务器,配置软件

    1.  购买域名 2.  购买云服务器ecs 3.  远程访问云服务器并装上Java环境和必备软件 3.1安装远程访问工具 3.2 jdk环境配置 3.3 Mysql依赖关系 重新配置MySQL的远程 ...

  4. linux 基本命令笔记

    nohup [process]  & 后台挂起命令nohup 挂起& 后台运行 python3 manage.py runserver 0.0.0.0:8080 python -r 递 ...

  5. linux连接FreeBSD虚拟机的mysql

    前言 本人菜鸟一枚,第一次写博客,不喜误喷. 实验环境 Opensuse15.0(主机).FreeBSD11.1(虚拟机).虚拟机VirtualBox5.2.22.mysql8.0.14 在FreeB ...

  6. zip压缩工具,unzip解压缩工具

    zip压缩工具,unzip解压缩工具=================== [root@aminglinux tmp]# yum install -y zip[root@aminglinux tmp] ...

  7. LeetCode962. 最大宽度坡

    问题:最大宽度坡 给定一个整数数组 A,坡是元组 (i, j),其中  i < j 且 A[i] <= A[j].这样的坡的宽度为 j - i. 找出 A 中的坡的最大宽度,如果不存在,返 ...

  8. 搭建MQTT代理服务器

    # 解压tar zxfv mosquitto-1.4.14.tar.gz# 进入目录cd mosquitto-1.4.14# 编译make# 安装sudo make instal 1 启动代理服务在第 ...

  9. 【CodeBase】PHP打印所有用户自定义常量

    print_r(get_defined_constants(true)['user']);

  10. Ansible学习 Playbooks_1

    Playbooks是Ansible中执行较复杂任务的一种的方式,Playbook由1个或多个play组成,语法格式是YAML,下面以一个简单的任务为例,开始我们的Playbook学习: 任务描述: 1 ...