丶一张纸而已 發表於 2019-6-27 23:15:00

全面解读php-正则表达式

<h1>一、正则表达式基础内容</h1>
<p><img src="https://img2018.cnblogs.com/blog/1064872/201906/1064872-20190627225250950-1353952535.png"></p>
<h2>注:</h2>
<h3>1、通用原子:</h3>
<ul>
<li><span style="font-size: 16px">\d : 数字。&nbsp; \D : 除了数字。</span></li>
<li><span style="font-size: 16px">\w : 数字,字母,下划线。</span><span style="font-size: 16px">\W : 除了数字,字母,下划线。</span></li>
<li><span style="font-size: 16px">\s&nbsp; : 空白符 。 \S : 除了空白符&nbsp; 。</span></li>
</ul>
<h3>&nbsp;2、元字符:</h3>
<ul>
<li><span style="font-size: 16px">. :除了换行以外的所有字符</span></li>
<li><span style="font-size: 16px">* : 匹配前面的内容出现 0 次及以上。</span></li>
<li><span style="font-size: 16px"><strong><span style="color: rgba(255, 0, 0, 1)">? :</span> <span style="color: rgba(255, 0, 0, 1)">匹配前面的内容出现 0 次或 1 次</span></strong>。</span></li>
<li><span style="font-size: 16px">+ : 出现一次或多次。</span></li>
<li><span style="font-size: 16px">^ : 必须以它开头。</span></li>
<li><span style="font-size: 16px">$ : 必须以它结尾。</span></li>
<li><span style="font-size: 16px">{n} : 恰巧出现 n 次。</span></li>
<li><span style="font-size: 16px">{n,} : 大于等于 n 次。</span></li>
<li><span style="font-size: 16px">{n,m} : 大于等于 n, 小于等于 m.</span></li>
<li><span style="font-size: 16px">[] : 是一个集合,匹配中括号中的任意一个字符,如:即为匹配a或b或者c。</span></li>
<li><span style="font-size: 16px"><strong><span style="color: rgba(255, 0, 0, 1)">() : 后项引用</span></strong> 或者是当做一个整体。</span></li>
<li><span style="font-size: 16px"><strong><span style="color: rgba(255, 0, 0, 1)">[^]:</span> <span style="color: rgba(255, 0, 0, 1)">取反。</span></strong></span></li>
<li><span style="font-size: 16px">| : 或者</span></li>
<li><span style="font-size: 16px">[-] : 代表一个范围,如,匹配即为 0123456789</span></li>
</ul>
<h3>&nbsp;3、模式修正符</h3>
<ul>
<li><span style="font-size: 16px"><strong><span style="color: rgba(255, 0, 0, 1)">i:不区分大小写</span></strong>。</span></li>
<li><span style="font-size: 16px">m:将字符串通过分隔符进行分割,将字符串中的每一行分别进行匹配。</span></li>
<li><span style="font-size: 16px">e: 将匹配出来的内容做一些php语法上的处理。</span></li>
<li><span style="font-size: 16px">s: 修正 "." 的换行。</span></li>
<li><span style="font-size: 16px"><strong><span style="color: rgba(255, 0, 0, 1)">U: 取消贪婪模式</span></strong>。</span></li>
<li><span style="font-size: 16px">x: 忽略模式中的空白符。</span></li>
<li><span style="font-size: 16px">A: 必须以这个模式开头。</span></li>
<li><span style="font-size: 16px">D: 修正 "$" 对 "\n" 的忽略。</span></li>
<li><span style="font-size: 16px"><strong><span style="color: rgba(255, 0, 0, 1)">u: 做 utf-8 中文匹配的时候使用。</span></strong></span></li>
<li><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><span style="font-size: 16px"><strong>g:该表达式可以进行全局匹配。</strong></span></span></span></li>
</ul>
<h4>&nbsp;示例:</h4>
<p>现在需要正则验证一个input框,我想输入的是非整数就自动变成空值。</p>
<p>正则如下;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 不加入/g,则只返回第一个匹配,无论执行多少次均是如此,如果加入g,则第一次执行也返回第一个匹配,再执行返回第二个匹配,依次类推。</span><span style="color: rgba(0, 128, 0, 1)">
#</span><span style="color: rgba(0, 128, 0, 1)">/[^0-9]/g,这个正则表达式的意思是全局匹配非数字类型和非-的字符。</span>

<strong><span style="color: rgba(255, 0, 0, 1)">/[^0-9|-]/g</span></strong></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;匹配到该正则后,就将input的值置空即可。</p>
<h1>二、后项引用</h1>
<p><img src="https://img2018.cnblogs.com/blog/1064872/201906/1064872-20190628223224466-24187623.png"></p>
<p><span style="font-size: 16px">如果想只去除掉b标签,只保留里面的字符串,这里就需要用到<strong><span style="color: rgba(255, 0, 0, 1)">后项引用</span></strong>。怎么样后项引用呢,就是将<strong><span style="color: rgba(255, 0, 0, 1)"> .* 括起来</span></strong>,然后在匹配的时候,写上<strong><span style="color: rgba(255, 0, 0, 1)"> \1</span></strong> ,\1 代表第一个括号里面匹配到的内容,当然为了防止 \ 将 1 转义掉,所以我们使用<strong><span style="color: rgba(255, 0, 0, 1)"> \\1 .</span></strong></span></p>
<h1>&nbsp;三、贪婪模式</h1>
<p><img src="https://img2018.cnblogs.com/blog/1064872/201906/1064872-20190628223954485-805776512.png"></p>
<p><span style="font-size: 16px">我们这是想匹配到每一个 b 标签,即<strong>&lt;b&gt;abc&lt;/b&gt;</strong> 和 <strong>&lt;b&gt;bcd&lt;/b&gt;,</strong></span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果使用下面的正则来匹配的话,会匹配出&lt;b&gt;abc&lt;/b&gt;&lt;b&gt;bcd&lt;/b&gt;.</span>
<span style="color: rgba(128, 0, 128, 1)">$pattern</span> = '/&lt;b&gt;.*&lt;\/b&gt;/';</span></pre>
</div>
<p><span style="font-size: 16px">所以此处我们要使用<strong><span style="color: rgba(255, 0, 0, 1)"> .*?</span><span style="color: rgba(255, 0, 0, 1)">来</span><span style="color: rgba(255, 0, 0, 1)">取消贪婪</span></strong>,?代表匹配前面的内容 0 次或者 1次。</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">正则表达式改为</span>
<span style="color: rgba(128, 0, 128, 1)">$pattern</span> = '/&lt;b&gt;<strong><span style="color: rgba(255, 0, 0, 1)">.*?</span></strong>&lt;/b&gt;/';</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">当然取消贪婪还有一种写法:就是在后面加上一个 <strong><span style="color: rgba(255, 0, 0, 1)">U</span></strong> ,即:</span>
<span style="color: rgba(128, 0, 128, 1)">$pattern</span> = '/&lt;b&gt;.*&lt;/b&gt;/<strong><span style="color: rgba(255, 0, 0, 1)">U</span></strong>';</span></pre>
</div>
<p><span style="font-size: 16px">但是切记<strong><span style="color: rgba(255, 102, 0, 1)">不能 .*? 和 U 一起用</span></strong>。</span></p>
<h1>四、延伸重点</h1>
<h2>1、常见PCRE函数</h2>
<p><img src="https://img2018.cnblogs.com/blog/1064872/201906/1064872-20190628224617734-1976229412.png"></p>
<h2>2、中文匹配</h2>
<p><img src="https://img2018.cnblogs.com/blog/1064872/201906/1064872-20190628224813877-58433148.png"></p>
<h3>示例:</h3>
<p><span style="font-size: 16px">$str = '中文';</span></p>
<p><span style="font-size: 16px">a、使用utf-8匹配中文:&nbsp;</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"><span style="color: rgba(128, 0, 128, 1)">$pattern</span> = '/[\x{4e00}-\x{9fa5}]+/u';</span></pre>
</div>
<p><span style="font-size: 16px">b、使用GB2312匹配中文:&nbsp;</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"><span style="color: rgba(128, 0, 128, 1)">$pattern</span> = '/[' . <span style="color: rgba(0, 128, 128, 1)">chr</span>(0xb0) . '-' . <span style="color: rgba(0, 128, 128, 1)">chr</span>(0xf7) . '][' .<span style="color: rgba(0, 128, 128, 1)">chr</span>(0xa1) . '-' . <span style="color: rgba(0, 128, 128, 1)">chr</span>(0xfe) .']/';</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="font-size: 16px"><span style="color: rgba(0, 128, 128, 1)">preg_match</span>(<span style="color: rgba(128, 0, 128, 1)">$pattern</span>, <span style="color: rgba(128, 0, 128, 1)">$str</span>, <span style="color: rgba(128, 0, 128, 1)">$match</span>);&nbsp;</span></pre>
</div>
<p><img src="https://img2018.cnblogs.com/blog/1064872/201906/1064872-20190628230646821-416575394.png"></p>
<h2>3、写正则表达式的思路</h2>
<p><img src="https://img2018.cnblogs.com/blog/1064872/201906/1064872-20190628231129018-1577806004.png"></p>
<h2>4、示例:</h2>
<p><img src="https://img2018.cnblogs.com/blog/1064872/201906/1064872-20190628231411809-1549767712.png"></p>
<p><span style="font-size: 16px">本文为袋鼠学习中的总结,如有转载请注明出处:<span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)">https://www.cnblogs.com/chrdai/p/11100233.html</span></span></span></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/chrdai/p/11100233.html
頁: [1]
查看完整版本: 全面解读php-正则表达式