uTools-Manuals/docs/php/preg_match.html
2019-04-28 19:00:34 +08:00

364 lines
19 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>执行匹配正则表达式</title>
</head>
<body class="docs"><div id="layout">
<div id="layout-content"><div id="function.preg-match" class="refentry">
<div class="refnamediv">
<h1 class="refname">preg_match</h1>
<p class="verinfo">(PHP 4, PHP 5, PHP 7)</p><p class="refpurpose"><span class="refname">preg_match</span> &mdash; <span class="dc-title">执行匹配正则表达式</span></p>
</div>
<div class="refsect1 description" id="refsect1-function.preg-match-description">
<h3 class="title">说明</h3>
<div class="methodsynopsis dc-description">
<span class="methodname"><strong>preg_match</strong></span>
( <span class="methodparam"><span class="type">string</span> <code class="parameter">$pattern</code></span>
, <span class="methodparam"><span class="type">string</span> <code class="parameter">$subject</code></span>
[, <span class="methodparam"><span class="type">array</span> <code class="parameter reference">&$matches</code></span>
[, <span class="methodparam"><span class="type">int</span> <code class="parameter">$flags</code><span class="initializer"> = 0</span></span>
[, <span class="methodparam"><span class="type">int</span> <code class="parameter">$offset</code><span class="initializer"> = 0</span></span>
]]] ) : <span class="type">int</span></div>
<p class="para rdfs-comment">
搜索<code class="parameter">subject</code><code class="parameter">pattern</code>给定的正则表达式的一个匹配.
</p>
</div>
<div class="refsect1 parameters" id="refsect1-function.preg-match-parameters">
<h3 class="title">参数</h3>
<p class="para">
<dl>
<dt>
<code class="parameter">pattern</code></dt>
<dd>
<p class="para">
要搜索的模式,字符串类型。
</p>
</dd>
<dt>
<code class="parameter">subject</code></dt>
<dd>
<p class="para">
输入字符串。
</p>
</dd>
<dt>
<code class="parameter">matches</code></dt>
<dd>
<p class="para">
如果提供了参数<code class="parameter">matches</code>,它将被填充为搜索结果。
<var class="varname"><var class="varname">$matches[0]</var></var>将包含完整模式匹配到的文本, <var class="varname"><var class="varname">$matches[1]</var></var>
将包含第一个捕获子组匹配到的文本,以此类推。
</p>
</dd>
<dt>
<code class="parameter">flags</code></dt>
<dd>
<p class="para">
<code class="parameter">flags</code>可以被设置为以下标记值:
<dl>
<dt>
<strong><code>PREG_OFFSET_CAPTURE</code></strong></dt>
<dd>
<p class="para">
如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。
注意:这会改变填充到<code class="parameter">matches</code>参数的数组,使其每个元素成为一个由
<em>0</em>个元素是匹配到的字符串,第<em>1</em>个元素是该匹配字符串
在目标字符串<code class="parameter">subject</code>中的偏移量。
<div class="informalexample">
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/(foo)(bar)(baz)/'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'foobarbaz'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$matches</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">PREG_OFFSET_CAPTURE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
<p class="para">以上例程会输出:</p>
<div class="example-contents screen">
<div class="cdata"><pre>
Array
(
[0] =&gt; Array
(
[0] =&gt; foobarbaz
[1] =&gt; 0
)
[1] =&gt; Array
(
[0] =&gt; foo
[1] =&gt; 0
)
[2] =&gt; Array
(
[0] =&gt; bar
[1] =&gt; 3
)
[3] =&gt; Array
(
[0] =&gt; baz
[1] =&gt; 6
)
)
</pre></div>
</div>
</div>
</p>
</dd>
</dl>
</p>
</dd>
<dt>
<code class="parameter">offset</code></dt>
<dd>
<p class="para">
通常,搜索从目标字符串的开始位置开始。可选参数 <code class="parameter">offset</code> 用于
指定从目标字符串的某个位置开始搜索(单位是字节)。
</p>
<blockquote class="note"><p><strong class="note">Note</strong>:
<p class="para">
使用<code class="parameter">offset</code>参数不同于向<span class="function"><strong>preg_match()</strong></span>
传递按照位置通过<em>substr($subject, $offset)</em>截取目标字符串结果,
因为<code class="parameter">pattern</code>可以包含断言比如<em class="emphasis">^</em> <em class="emphasis">$</em>
或者<em class="emphasis">(?&lt;=x)</em>。 比较:
<div class="informalexample">
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$subject&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"abcdef"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$pattern&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'/^def/'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #0000BB">$pattern</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$subject</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$matches</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">PREG_OFFSET_CAPTURE</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">3</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
<p class="para">以上例程会输出:</p>
<div class="example-contents screen">
<div class="cdata"><pre>
Array
(
)
</pre></div>
</div>
<p class="para">
当这个示例使用截取后传递时
</p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$subject&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">"abcdef"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$pattern&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'/^def/'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #0000BB">$pattern</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$subject</span><span style="color: #007700">,</span><span style="color: #0000BB">3</span><span style="color: #007700">),&nbsp;</span><span style="color: #0000BB">$matches</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">PREG_OFFSET_CAPTURE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
<p class="para">
将会产生匹配
</p>
<div class="example-contents screen">
<div class="cdata"><pre>
Array
(
[0] =&gt; Array
(
[0] =&gt; def
[1] =&gt; 0
)
)
</pre></div>
</div>
</div>
</p>
</p></blockquote>
</dd>
</dl>
</p>
</div>
<div class="refsect1 returnvalues" id="refsect1-function.preg-match-returnvalues">
<h3 class="title">返回值</h3>
<p class="para">
<span class="function"><strong>preg_match()</strong></span>返回 <code class="parameter">pattern</code> 的匹配次数。
它的值将是0次不匹配或1次因为<span class="function"><strong>preg_match()</strong></span>在第一次匹配后
将会停止搜索。<span class="function"><a href="preg_match_all.html" class="function">preg_match_all()</a></span>不同于此,它会一直搜索<code class="parameter">subject</code>
直到到达结尾。
如果发生错误<span class="function"><strong>preg_match()</strong></span>返回 <strong><code>FALSE</code></strong>
</p>
</div>
<div class="refsect1 changelog" id="refsect1-function.preg-match-changelog">
<h3 class="title">更新日志</h3>
<p class="para">
<table class="doctable informaltable">
<thead>
<tr>
<th>版本</th>
<th>说明</th>
</tr>
</thead>
<tbody class="tbody">
<tr>
<td>5.3.6</td>
<td>
如果 <code class="parameter">offset</code><code class="parameter">subject</code> 的长度还要大则返回 <strong><code>FALSE</code></strong>
</td>
</tr>
<tr>
<td>5.2.2</td>
<td>
命名子组可以接受<em>(?&lt;name&gt;)</em> <em>(?&#039;name&#039;)</em>
以及<em>(?P&lt;name&gt;)</em>语法。之前版本仅接受<em>(?P&lt;name&gt;)</em>语法。
</td>
</tr>
</tbody>
</table>
</p>
</div>
<div class="refsect1 examples" id="refsect1-function.preg-match-examples">
<h3 class="title">范例</h3>
<p class="para">
<div class="example" id="example-5862">
<p><strong>Example #1 查找文本字符串&quot;php&quot;</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//模式分隔符后的"i"标记这是一个大小写不敏感的搜索<br /></span><span style="color: #007700">if&nbsp;(</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/php/i"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"PHP&nbsp;is&nbsp;the&nbsp;web&nbsp;scripting&nbsp;language&nbsp;of&nbsp;choice."</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"A&nbsp;match&nbsp;was&nbsp;found."</span><span style="color: #007700">;<br />}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"A&nbsp;match&nbsp;was&nbsp;not&nbsp;found."</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
</div>
</p>
<p class="para">
<div class="example" id="example-5863">
<p><strong>Example #2 查找单词&quot;word&quot;</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/*&nbsp;模式中的\b标记一个单词边界所以只有独立的单词"web"会被匹配,而不会匹配<br />&nbsp;*&nbsp;单词的部分内容比如"webbing"&nbsp;&nbsp;"cobweb"&nbsp;*/<br /></span><span style="color: #007700">if&nbsp;(</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/\bweb\b/i"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"PHP&nbsp;is&nbsp;the&nbsp;web&nbsp;scripting&nbsp;language&nbsp;of&nbsp;choice."</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"A&nbsp;match&nbsp;was&nbsp;found."</span><span style="color: #007700">;<br />}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"A&nbsp;match&nbsp;was&nbsp;not&nbsp;found."</span><span style="color: #007700">;<br />}<br /><br />if&nbsp;(</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/\bweb\b/i"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"PHP&nbsp;is&nbsp;the&nbsp;website&nbsp;scripting&nbsp;language&nbsp;of&nbsp;choice."</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"A&nbsp;match&nbsp;was&nbsp;found."</span><span style="color: #007700">;<br />}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"A&nbsp;match&nbsp;was&nbsp;not&nbsp;found."</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
</div>
</p>
<p class="para">
<div class="example" id="example-5864">
<p><strong>Example #3 获取URL中的域名</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">//从URL中获取主机名称<br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'@^(?:http://)?([^/]+)@i'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">"http://www.php.net/index.html"</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$host&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">$matches</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">//获取主机名称的后面两部分<br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/[^.]+\.[^.]+$/'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$host</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br />echo&nbsp;</span><span style="color: #DD0000">"domain&nbsp;name&nbsp;is:&nbsp;</span><span style="color: #007700">{</span><span style="color: #0000BB">$matches</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
<div class="example-contents"><p>以上例程会输出:</p></div>
<div class="example-contents screen">
<div class="cdata"><pre>
domain name is: php.net
</pre></div>
</div>
</div>
</p>
<p class="para">
<div class="example" id="example-5865">
<p><strong>Example #4 使用命名子组</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /><br />$str&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'foobar:&nbsp;2008'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/(?P&lt;name&gt;\w+):&nbsp;(?P&lt;digit&gt;\d+)/'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$str</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/*&nbsp;下面例子在php&nbsp;5.2.2(pcre&nbsp;7.0)或更新版本下工作,&nbsp;然而,&nbsp;为了后向兼容,&nbsp;上面的方式是推荐写法.&nbsp;*/<br />//&nbsp;preg_match('/(?&lt;name&gt;\w+):&nbsp;(?&lt;digit&gt;\d+)/',&nbsp;$str,&nbsp;$matches);<br /><br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
<div class="example-contents"><p>以上例程会输出:</p></div>
<div class="example-contents screen">
<div class="cdata"><pre>
Array
(
[0] =&gt; foobar: 2008
[name] =&gt; foobar
[1] =&gt; foobar
[digit] =&gt; 2008
[2] =&gt; 2008
)
</pre></div>
</div>
</div>
</p>
</div>
<div class="refsect1 notes" id="refsect1-function.preg-match-notes">
<h3 class="title">注释</h3>
<div class="tip"><strong class="tip">Tip</strong>
<p class="para">
如果你仅仅想要检查某个字符串是否包含另外一个字符串,不要使用<span class="function"><strong>preg_match()</strong></span>
使用 <span class="function"><a href="strpos.html" class="function">strpos()</a></span> 会更快。
</p>
</div>
</div>
<div class="refsect1 seealso" id="refsect1-function.preg-match-seealso">
<h3 class="title">参见</h3>
<p class="para">
<ul class="simplelist">
<li class="member"><a href="pcre.pattern.html" class="link">PCRE 模式</a></li>
<li class="member"><span class="function"><a href="preg_quote.html" class="function" rel="rdfs-seeAlso">preg_quote()</a> - 转义正则表达式字符</span></li>
<li class="member"><span class="function"><a href="preg_match_all.html" class="function" rel="rdfs-seeAlso">preg_match_all()</a> - 执行一个全局正则表达式匹配</span></li>
<li class="member"><span class="function"><a href="preg_replace.html" class="function" rel="rdfs-seeAlso">preg_replace()</a> - 执行一个正则表达式的搜索和替换</span></li>
<li class="member"><span class="function"><a href="preg_split.html" class="function" rel="rdfs-seeAlso">preg_split()</a> - 通过一个正则表达式分隔字符串</span></li>
<li class="member"><span class="function"><a href="preg_last_error.html" class="function" rel="rdfs-seeAlso">preg_last_error()</a> - 返回最后一个PCRE正则执行产生的错误代码</span></li>
</ul>
</p>
</div>
</div></div></div></body></html>