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

349 lines
21 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-replace" class="refentry">
<div class="refnamediv">
<h1 class="refname">preg_replace</h1>
<p class="verinfo">(PHP 4, PHP 5, PHP 7)</p><p class="refpurpose"><span class="refname">preg_replace</span> &mdash; <span class="dc-title">执行一个正则表达式的搜索和替换</span></p>
</div>
<div class="refsect1 description" id="refsect1-function.preg-replace-description">
<h3 class="title">说明</h3>
<div class="methodsynopsis dc-description">
<span class="methodname"><strong>preg_replace</strong></span>
( <span class="methodparam"><span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span> <code class="parameter">$pattern</code></span>
, <span class="methodparam"><span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span> <code class="parameter">$replacement</code></span>
, <span class="methodparam"><span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span> <code class="parameter">$subject</code></span>
[, <span class="methodparam"><span class="type">int</span> <code class="parameter">$limit</code><span class="initializer"> = -1</span></span>
[, <span class="methodparam"><span class="type">int</span> <code class="parameter reference">&$count</code></span>
]] ) : <span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span></div>
<p class="para rdfs-comment">
搜索<code class="parameter">subject</code>中匹配<code class="parameter">pattern</code>的部分,
<code class="parameter">replacement</code>进行替换。
</p>
</div>
<div class="refsect1 parameters" id="refsect1-function.preg-replace-parameters">
<h3 class="title">参数</h3>
<p class="para">
<dl>
<dt>
<code class="parameter">pattern</code></dt>
<dd>
<p class="para">
要搜索的模式。可以使一个字符串或字符串数组。
</p>
<p class="para">
可以使用一些<a href="reference.pcre.pattern.modifiers.html" class="link">PCRE修饰符</a>
</p>
</dd>
<dt>
<code class="parameter">replacement</code></dt>
<dd>
<p class="para">
用于替换的字符串或字符串数组。如果这个参数是一个字符串,并且<code class="parameter">pattern</code>
是一个数组,那么所有的模式都使用这个字符串进行替换。如果<code class="parameter">pattern</code><code class="parameter">replacement</code>
都是数组,每个<code class="parameter">pattern</code>使用<code class="parameter">replacement</code>中对应的
元素进行替换。如果<code class="parameter">replacement</code>中的元素比<code class="parameter">pattern</code>中的少,
多出来的<code class="parameter">pattern</code>使用空字符串进行替换。
</p>
<p class="para">
<code class="parameter">replacement</code>中可以包含后向引用<em>\\<span class="replaceable">n</span></em>
<em>$<span class="replaceable">n</span></em>,语法上首选后者。 每个
这样的引用将被匹配到的第<span class="replaceable">n</span>个捕获子组捕获到的文本替换。 <span class="replaceable">n</span>
可以是0-99<em>\\0</em><em>$0</em>代表完整的模式匹配文本。
捕获子组的序号计数方式为:代表捕获子组的左括号从左到右, 从1开始数。如果要在<code class="parameter">replacement</code>
中使用反斜线必须使用4个(<em>&quot;\\\\&quot;</em>译注因为这首先是php的字符串经过转义后是两个再经过
正则表达式引擎后才被认为是一个原文反斜线)。
</p>
<p class="para">
当在替换模式下工作并且后向引用后面紧跟着需要是另外一个数字(比如:在一个匹配模式后紧接着增加一个原文数字)
不能使用<em>\\1</em>这样的语法来描述后向引用。比如, <em>\\11</em>将会使<span class="function"><strong>preg_replace()</strong></span>
不能理解你希望的是一个<em>\\1</em>后向引用紧跟一个原文<em>1</em>,还是
一个<em>\\11</em>后向引用后面不跟任何东西。 这种情况下解决方案是使用<em>${1}1</em>
这创建了一个独立的<em>$1</em>后向引用, 一个独立的原文<em>1</em>
</p>
<p class="para">
当使用被弃用的 <em>e</em> 修饰符时, 这个函数会转义一些字符(即:<em>&#039;</em><em>&quot;</em>
<em>\</em> 和 NULL) 然后进行后向引用替换。当这些完成后请确保后向引用解析完后没有单引号或
双引号引起的语法错误(比如: <em>&#039;strlen(\&#039;$1\&#039;)+strlen(&quot;$2&quot;)&#039;</em>)。确保符合PHP的
<a href="language.types.string.html" class="link">字符串语法</a>并且符合eval语法。因为在完成替换后
引擎会将结果字符串作为php代码使用eval方式进行评估并将返回值作为最终参与替换的字符串。
</p>
</dd>
<dt>
<code class="parameter">subject</code></dt>
<dd>
<p class="para">
要进行搜索和替换的字符串或字符串数组。
</p>
<p class="para">
如果<code class="parameter">subject</code>是一个数组,搜索和替换回在<code class="parameter">subject</code>
的每一个元素上进行, 并且返回值也会是一个数组。
</p>
</dd>
<dt>
<code class="parameter">limit</code></dt>
<dd>
<p class="para">
每个模式在每个<code class="parameter">subject</code>上进行替换的最大次数。默认是
<em>-1</em>(无限)。
</p>
</dd>
<dt>
<code class="parameter">count</code></dt>
<dd>
<p class="para">
如果指定,将会被填充为完成的替换次数。
</p>
</dd>
</dl>
</p>
</div>
<div class="refsect1 returnvalues" id="refsect1-function.preg-replace-returnvalues">
<h3 class="title">返回值</h3>
<p class="para">
如果<code class="parameter">subject</code>是一个数组, <span class="function"><strong>preg_replace()</strong></span>返回一个数组,
其他情况下返回一个字符串。
</p>
<p class="para">
如果匹配被查找到,替换后的<code class="parameter">subject</code>被返回,其他情况下
返回没有改变的 <code class="parameter">subject</code>。如果发生错误,返回 <strong><code>NULL</code></strong>
</p>
</div>
<div class="refsect1 errors" id="refsect1-function.preg-replace-errors">
<h3 class="title">错误/异常</h3>
<p class="para">
PHP 5.5.0 起, 传入 &quot;\e&quot; 修饰符的时候,会产生一个 <strong><code>E_DEPRECATED</code></strong> 错误; PHP 7.0.0 起,会产生 <strong><code>E_WARNING</code></strong> 错误,同时 &quot;\e&quot; 也无法起效。
</p>
</div>
<div class="refsect1 changelog" id="refsect1-function.preg-replace-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>7.0.0</td>
<td>
不再支持 <em>/e</em>修饰符。
请用 <span class="function"><a href="preg_replace_callback.html" class="function">preg_replace_callback()</a></span> 代替。
</td>
</tr>
<tr>
<td>5.5.0</td>
<td>
<em>/e</em> 修饰符已经被弃用了。使用
<span class="function"><a href="preg_replace_callback.html" class="function">preg_replace_callback()</a></span> 代替。参见文档中 <a href="reference.pcre.pattern.modifiers.html#reference.pcre.pattern.modifiers.eval" class="link">PREG_REPLACE_EVAL</a> 关于安全风险的更多信息。
</td>
</tr>
<tr>
<td>5.1.0</td>
<td>
增加参数<code class="parameter">count</code>.
</td>
</tr>
</tbody>
</table>
</p>
</div>
<div class="refsect1 examples" id="refsect1-function.preg-replace-examples">
<h3 class="title">范例</h3>
<p class="para">
<div class="example" id="example-5872">
<p><strong>Example #1 使用后向引用紧跟数值原文</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$string&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'April&nbsp;15,&nbsp;2003'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$pattern&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'/(\w+)&nbsp;(\d+),&nbsp;(\d+)/i'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$replacement&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'${1}1,$3'</span><span style="color: #007700">;<br />echo&nbsp;</span><span style="color: #0000BB">preg_replace</span><span style="color: #007700">(</span><span style="color: #0000BB">$pattern</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$replacement</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$string</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>
April1,2003
</pre></div>
</div>
</div>
</p>
<p class="para">
<div class="example" id="example-5873">
<p><strong>Example #2 <span class="function"><strong>preg_replace()</strong></span>中使用基于索引的数组</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$string&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'The&nbsp;quick&nbsp;brown&nbsp;fox&nbsp;jumps&nbsp;over&nbsp;the&nbsp;lazy&nbsp;dog.'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$patterns&nbsp;</span><span style="color: #007700">=&nbsp;array();<br /></span><span style="color: #0000BB">$patterns</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #DD0000">'/quick/'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$patterns</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #DD0000">'/brown/'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$patterns</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #DD0000">'/fox/'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$replacements&nbsp;</span><span style="color: #007700">=&nbsp;array();<br /></span><span style="color: #0000BB">$replacements</span><span style="color: #007700">[</span><span style="color: #0000BB">2</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #DD0000">'bear'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$replacements</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #DD0000">'black'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$replacements</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]&nbsp;=&nbsp;</span><span style="color: #DD0000">'slow'</span><span style="color: #007700">;<br />echo&nbsp;</span><span style="color: #0000BB">preg_replace</span><span style="color: #007700">(</span><span style="color: #0000BB">$patterns</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$replacements</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$string</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>
The bear black slow jumps over the lazy dog.
</pre></div>
</div>
<div class="example-contents"><p>
对模式和替换内容按key进行排序我们可以得到期望的结果。
</p></div>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />ksort</span><span style="color: #007700">(</span><span style="color: #0000BB">$patterns</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">ksort</span><span style="color: #007700">(</span><span style="color: #0000BB">$replacements</span><span style="color: #007700">);<br />echo&nbsp;</span><span style="color: #0000BB">preg_replace</span><span style="color: #007700">(</span><span style="color: #0000BB">$patterns</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$replacements</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$string</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>
The slow black bear jumps over the lazy dog.
</pre></div>
</div>
</div>
</p>
<p class="para">
<div class="example" id="example-5874">
<p><strong>Example #3 替换一些值</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$patterns&nbsp;</span><span style="color: #007700">=&nbsp;array&nbsp;(</span><span style="color: #DD0000">'/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/'</span><span style="color: #007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #DD0000">'/^\s*{(\w+)}\s*=/'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$replace&nbsp;</span><span style="color: #007700">=&nbsp;array&nbsp;(</span><span style="color: #DD0000">'\3/\4/\1\2'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'$\1&nbsp;='</span><span style="color: #007700">);<br />echo&nbsp;</span><span style="color: #0000BB">preg_replace</span><span style="color: #007700">(</span><span style="color: #0000BB">$patterns</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$replace</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'{startDate}&nbsp;=&nbsp;1999-5-27'</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>
$startDate = 5/27/1999
</pre></div>
</div>
</div>
</p>
<p class="para">
<div class="example" id="example-5875">
<p><strong>Example #4 剥离空白字符</strong></p>
<div class="example-contents"><p>
这个例子剥离多余的空白字符
</p></div>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$str&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'foo&nbsp;&nbsp;&nbsp;o'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$str&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">preg_replace</span><span style="color: #007700">(</span><span style="color: #DD0000">'/\s\s+/'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'&nbsp;'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$str</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">//&nbsp;将会改变为'foo&nbsp;o'<br /></span><span style="color: #007700">echo&nbsp;</span><span style="color: #0000BB">$str</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
</div>
</p>
<p class="para">
<div class="example" id="example-5876">
<p><strong>Example #5 使用参数<code class="parameter">count</code></strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$count&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br />echo&nbsp;</span><span style="color: #0000BB">preg_replace</span><span style="color: #007700">(array(</span><span style="color: #DD0000">'/\d/'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'/\s/'</span><span style="color: #007700">),&nbsp;</span><span style="color: #DD0000">'*'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'xp&nbsp;4&nbsp;to'</span><span style="color: #007700">,&nbsp;-</span><span style="color: #0000BB">1&nbsp;</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$count</span><span style="color: #007700">);<br />echo&nbsp;</span><span style="color: #0000BB">$count</span><span style="color: #007700">;&nbsp;</span><span style="color: #FF8000">//3<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>
xp***to
3
</pre></div>
</div>
</div>
</p>
</div>
<div class="refsect1 notes" id="refsect1-function.preg-replace-notes">
<h3 class="title">注释</h3>
<blockquote class="note"><p><strong class="note">Note</strong>:
<p class="para">
当使用数组形式的<code class="parameter">pattern</code><code class="parameter">replacement</code>时,
将会按照key在数组中出现的顺序进行处理. 这<em class="emphasis">不一定</em>和数组的索引顺序一致.
如果你期望使用索引对等方式用<code class="parameter">replacement</code><code class="parameter">pattern</code>
进行替换, 你可以在调用<span class="function"><strong>preg_replace()</strong></span>之前对两个数组各进行一次<span class="function"><a href="ksort.html" class="function">ksort()</a></span>排序.
</p>
</p></blockquote>
</div>
<div class="refsect1 seealso" id="refsect1-function.preg-replace-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_filter.html" class="function" rel="rdfs-seeAlso">preg_filter()</a> - 执行一个正则表达式搜索和替换</span></li>
<li class="member"><span class="function"><a href="preg_match.html" class="function" rel="rdfs-seeAlso">preg_match()</a> - 执行匹配正则表达式</span></li>
<li class="member"><span class="function"><a href="preg_replace_callback.html" class="function" rel="rdfs-seeAlso">preg_replace_callback()</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>