在PHP中使用e修饰符preg_replace

PHP函数preg_replace()本身具有强大的功能,但是可以通过包含e修饰符来增加深度。请看下面的代码,它只是挑选出一个字符串中的字母,并用字母X代替它们。

$something = 'df1gdf2gdf3sgdfg';
$something = preg_replace("/([a-z]*)/", "X", $something);
echo $something; // 打印XX1XX2XX3XX

这很简单,但是使用e修饰符使我们可以在replace参数内使用PHP函数。下面的代码使用strtoupper()PHP函数将随机字母字符串中的所有字母变为大写。

$something = 'df1gdf2gdf3sgdfg';
$something = preg_replace("/([a-z]*)/e", "strtoupper('\\1')", $something);
echo $something; // 打印DF1GDF2GDF3SGDFG

这是另一个示例,但是在这种情况下,完整字符串将在修改后的字符串之后重复。

$something = 'df1gdf2gdf3sgdfg';
$something = preg_replace("/([a-z0-9]*)/e", "strtoupper('\\1').'\\1'", $something);
echo $something; // 打印DF1GDF2GDF3SGDFGdf1gdf2gdf3sgdfg

请注意,使用e修饰符时,正确地将单引号和双引号引起来的字符串转义很重要。这是因为整个字符串都被解析为PHP,因此如果您不在反引用周围加上单引号,则会使PHP抱怨常量。

对于一个更复杂的示例,我修改了createTextLinks()该站点上最近编写的函数。该函数最初在较大的字符串中找到任何URL字符串,然后将它们转换为链接。修改后的函数现在返回相同的内容,只是使用该shortenurl()函数已缩短了链接文本。

$longurl = "there is the new site http://www.google.co.uk/search?aq=f&num=100&hl=en&client=firefox-a&channel=s&rls=org.mozilla%3Aen-US%3Aofficial";
 
function createShortTextLinks($str='') {
 
 if($str=='' or !preg_match('/(http|www\.|@)/im', $str)){
  return $str;
 }
 
 // 替换链接:
 $str = preg_replace("/([ \t]|^)www\./im", "\\1http://www.", $str);
 $str = preg_replace("/([ \t]|^)ftp\./im", "\\1ftp://ftp.", $str);
 
 $str = preg_replace("/(https?:\/\/[^ )\r\n!]+)/eim", "'<a href=\"\\1\" title=\"\\1\">'.shortenurl('\\1').'</a>'", $str);
 
 $str = preg_replace("/(ftp:\/\/[^ )\r\n!]+)/eim", "'<a href=\"\\1\" title=\"\\1\">'.shortenurl('\\1').'</a>'", $str);
 
 $str = preg_replace("/([-a-z0-9_]+(\.[_a-z0-9-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)+))/eim", "'<a href=\"mailto:\\1\" title=\"Email \\1\">'.shortenurl('\\1').'</a>'", $str);
 
 $str = preg_replace("/(\&)/im","\\1amp;", $str);
 
 return $str;
}
 
function shortenurl($url){
 if(strlen($url) > 45){
  return substr($url, 0, 30)."[...]".substr($url, -15);
 }else{
  return $url;
 }
}
 
echo createShortTextLinks($longurl);