Monday, 13 August 2018

Using The e Modifier In PHP preg_replace

The PHP function preg_replace() has powerful functionality in its own right, but extra depth can be added with the inclusion of the e modifier. Take the following bit of code, which just picks out the letters of a string and replaces them with the letter X.
  1. $something = 'df1gdf2gdf3sgdfg';
  2. $something = preg_replace("/([a-z]*)/", "X", $something);
  3. echo $something; // prints XX1XX2XX3XX
This is simple enough, but using the e modifier allows us to use PHP functions within the replace parameters. The following bit of code turns all letters upper case in a string of random letters by using the strtoupper() PHP function.
  1. $something = 'df1gdf2gdf3sgdfg';
  2. $something = preg_replace("/([a-z]*)/e", "strtoupper('\\1')", $something);
  3. echo $something; // prints DF1GDF2GDF3SGDFG
Here is another example, but in this case the full string is repeated after the modified string.
  1. $something = 'df1gdf2gdf3sgdfg';
  2. $something = preg_replace("/([a-z0-9]*)/e", "strtoupper('\\1').'\\1'", $something);
  3. echo $something; // prints DF1GDF2GDF3SGDFGdf1gdf2gdf3sgdfg
Notice that when using the e modifier it is important to properly escape the string with single and double quotes. This is because the string as a whole is parsed as PHP and so if you don't put single quotes around the backreferences then you will get PHP complaining about constants.
For a more complex example I modified the createTextLinks() function that wrote about recently on the site. The function originally found any URL strings within a larger string and turned them into links. The modified function now returns the same thing, except that the link text has been shortened using the shortenurl() function.
  1. $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";
  2.  
  3. function createShortTextLinks($str='') {
  4.  
  5. if($str=='' or !preg_match('/(http|www\.|@)/im', $str)){
  6. return $str;
  7. }
  8.  
  9. // replace links:
  10. $str = preg_replace("/([ \t]|^)www\./im", "\\1http://www.", $str);
  11. $str = preg_replace("/([ \t]|^)ftp\./im", "\\1ftp://ftp.", $str);
  12.  
  13. $str = preg_replace("/(https?:\/\/[^ )\r\n!]+)/eim", "'<a href=\"\\1\" title=\"\\1\">'.shortenurl('\\1').'</a>'", $str);
  14.  
  15. $str = preg_replace("/(ftp:\/\/[^ )\r\n!]+)/eim", "'<a href=\"\\1\" title=\"\\1\">'.shortenurl('\\1').'</a>'", $str);
  16.  
  17. $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);
  18.  
  19. $str = preg_replace("/(\&)/im","\\1amp;", $str);
  20.  
  21. return $str;
  22. }
  23.  
  24. function shortenurl($url){
  25. if(strlen($url) > 45){
  26. return substr($url, 0, 30)."[...]".substr($url, -15);
  27. }else{
  28. return $url;
  29. }
  30. }
  31.  
  32. echo createShortTextLinks($longurl);

0 comments:

Post a Comment