preg_replace_callback_array
执行正则表达式搜索并使用回调替换
展示一个句子中每个单词包含多少字母或数字:
<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">function</span> <span class="token function-definition function">countLetters</span><span class="token punctuation">(</span><span class="token variable">$matches</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$matches</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'['</span> <span class="token operator">.</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$matches</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'letter]'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">countDigits</span><span class="token punctuation">(</span><span class="token variable">$matches</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$matches</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'['</span> <span class="token operator">.</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$matches</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'digit]'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$input</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"There are 365 days in a year."</span><span class="token punctuation">;</span> <span class="token variable">$patterns</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'/\b[a-z]+\b/i'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'countLetters'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'/\b[0-9]+\b/'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'countDigits'</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">preg_replace_callback_array</span><span class="token punctuation">(</span><span class="token variable">$patterns</span><span class="token punctuation">,</span> <span class="token variable">$input</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$result</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span>
此例说明了按顺序评估模式可能产生的潜在意外效果。首先,countLetters 替换会在 "days" 后添加 "[4letter]",执行该替换后,countDigits 替换会在 "4letter" 中找到 "4" 并添加 "[1digit]":
<span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">function</span> <span class="token function-definition function">countLetters</span><span class="token punctuation">(</span><span class="token variable">$matches</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$matches</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'['</span> <span class="token operator">.</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$matches</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'letter]'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function-definition function">countDigits</span><span class="token punctuation">(</span><span class="token variable">$matches</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$matches</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'['</span> <span class="token operator">.</span> <span class="token function">strlen</span><span class="token punctuation">(</span><span class="token variable">$matches</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">.</span> <span class="token string single-quoted-string">'digit]'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$input</span> <span class="token operator">=</span> <span class="token string double-quoted-string">"365 days"</span><span class="token punctuation">;</span> <span class="token variable">$patterns</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string single-quoted-string">'/[a-z]+/i'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'countLetters'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'/[0-9]+/'</span> <span class="token operator">=></span> <span class="token string single-quoted-string">'countDigits'</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token variable">$result</span> <span class="token operator">=</span> <span class="token function">preg_replace_callback_array</span><span class="token punctuation">(</span><span class="token variable">$patterns</span><span class="token punctuation">,</span> <span class="token variable">$input</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">echo</span> <span class="token variable">$result</span><span class="token punctuation">;</span> <span class="token delimiter important">?></span></span>