zoukankan      html  css  js  c++  java
  • php

    任务:匹配一个函数名或者变量名,如果碰到alpha,numeric,_以外的全部不允许通过。

    实验1:

    <?php
    //第一个字符不符合就直接退出正则匹配
    $str = '%abcscript%d';
    var_dump(preg_match('/^(w*)$/', $str, $matches));
    var_dump($matches);
    #########output########
    #int(0)
    #array(0) {
    #}
    #######################
    
    #匹配到
    $str1 = 'abcscriptd123_';
    var_dump(preg_match('/^(w*?)$/', $str1, $matches));
    var_dump($matches);
    #########output########
    #int(1)
    #array(2) {
    #    [0]=>
    #    string(14) "abcscriptd123_"
    #    [1]=>
    #    string(14) "abcscriptd123_"
    #}
    #######################
    
    #中间有不匹配模式的
    $str2 = 'acd%acd';
    var_dump(preg_match('/^(w*?)/', $str2, $matches));
    var_dump($matches);
    #########output########
    #int(1)
    #array(2) {
    #    [0]=>
    #        string(0) ""
    #    [1]=>
    #        string(0) ""
    #}
    #####################
    //检查一个字符串里面仅包含字母数字或者下划线

     第一个的结果显而易见,preg_match返回0,第二个的结果如预期是全串都符合并匹配到,第三个的结果有些出人意料,那为什么preg_match返回1,而$matches未如预期一样包含匹配到的acd呢?

    再做一个实验,实验2

    <?php
    #中间有不匹配模式的
    $str2 = 'acd%acd';
    var_dump(preg_match('/^(w*)/', $str2, $matches));
    var_dump($matches);
    #########output########
    #int(1)
    #array(2) {
    #  [0]=>
    #  string(3) "acd"
    #  [1]=>
    #  string(3) "acd"
    #}
    #####################

    实验2的结果:这次可以匹配到符合条件的部分子串 "acd" 了。

    对比结果表明:?这个贪婪匹配符起到了很重要的作用,但是对其的工作原理仍然不甚明了。需要继续深入理解。 

    那么如何完成任务?要检查一个字符串是否只包含alpha, numeric, _

    结论是: preg_match('/(w*)/', $str, $matches);

    检查$matches[1] == $str,如果为true则表示该字符串满足条件,为false则表示该字符串不满足条件

    <?php
    $str = 'acd123_';
    var_dump(check_word($str));
    $str = 'acd%123_';
    var_dump(check_word($str));
    $str = '%acd123_';
    var_dump(check_word($str));
    
    function check_word($str)
    {
        preg_match('/^(w*)/', $str, $matches);
        if($matches[1] == $str){
            return true;
        } else {
            return false;
        }   
    }

    输出:

    bool(true)
    bool(false)
    bool(false)

    任务:把ubb中img标签的内容找出来[img]100.png[/img]

    目标:熟悉正则表达式中()的用法

    代码:

    <?php
    
    $str = '[img]100[/img]test.png[img]1000[/img]';
    preg_match_all('/[img](.*?)[/img]/', $str, $matches);
    var_dump($matches);
    

      

    输出:

    array(2) {
      [0]=>
      array(2) {
        [0]=>
        string(14) "[img]100[/img]"
        [1]=>
        string(15) "[img]1000[/img]"
      }
      [1]=>
      array(2) {
        [0]=>
        string(3) "100"
        [1]=>
        string(4) "1000"
      }
    }
    

    任务:把[img]100[/img]提取出来,满足两个要求:能够提取100,并且能够提取出[img]100[/img]这样的模式

    目标:熟悉正则表达式中()的用法

    代码:

    <?php
    
    $str = '[img]100[/img]test.png[img]1000[/img]';
    preg_match_all('/([img](.*?)[/img])/', $str, $matches);
    var_dump($matches);

    输出: 

    array(3) {
      [0]=>
      array(2) {
        [0]=>
        string(14) "[img]100[/img]"
        [1]=>
        string(15) "[img]1000[/img]"
      }
      [1]=>
      array(2) {
        [0]=>
        string(14) "[img]100[/img]"
        [1]=>
        string(15) "[img]1000[/img]"
      }
      [2]=>
      array(2) {
        [0]=>
        string(3) "100"
        [1]=>
        string(4) "1000"
      }
    }

    理解:正则表达式的括号()能提取字符串中的那些匹配的串,0号match是整个模式的匹配串,1号match是从左往右的第一个()括号中匹配的内容,2号match是第二个()括号中匹配的内容,以此类推。

    关于preg_match_all, 可见另一篇文章:http://www.cnblogs.com/helww/p/3248345.html

    keyword: preg_match preg_match_all

  • 相关阅读:
    前端学习之JavaScript
    前端学习之CSS
    前端学习之HTML
    MySQL多表查询(重要)
    C# 基本语法
    第 9 章 —— 原型模式
    第 7 章 —— 代理模式
    第 6 章 —— 装饰模式
    将搜索关键词加红
    SQL Server 创建触发器(trigger)
  • 原文地址:https://www.cnblogs.com/helww/p/3466720.html
Copyright © 2011-2022 走看看