php中的字符串替换函数str_replace使用帮助正则表达式

风清扬斈 11年前 (2009-02-12) 信息科技 5916 0

str_replace函数

功能: 字符串替换
语法: string str_replace(string needle, string str, string haystack);
返回值: 字符串
函数种类: 字符串处理

本函数将字符串 str 代入 haystack 字符串中,将所有的 needle 置换成 str。mlevine@adtraq.com (11-Apr-1999) 指出在 PHP 3.0.7 版,本函数有些 bug,而 nadeem@bleh.org (05-Jun-1999) 补充在 PHP 3.0.8 版本函数就回复正常了。
使用范例

下例将 %body% 以 black 取代

< php
$bodytag = str_replace("%body%", "black", "<body text=%body%>");
echo $bodytag;
>

格式:
[@str_replace("要替换的旧内容", "要取代原内容的新字符", $被替换内容的变量名)]
[@str_replace(array((i)旧1(i),(i)旧2(i),(i)旧3(i)), array((i)新1(i),(i)新2(i),(i)新3(i)), $被替换内容的变量名)]
[@str_replace(array((i)旧1(i),(i)旧2(i),(i)旧3(i)), (i)新内容(i), $被替换内容的变量名)]
实例:
多对一替换:想把内容字段里所有的<p></p>标签清除掉,替换成空

[@str_replace(array((i)<p>(i),(i)</p>(i)), (i)(i), $Content)]
一对一替换:想把内容字段里所有的<br>标签换成<p>

[@str_replace((i)<br>(i), (i)<p>(i), $Content)]
多对多替换:想把内容字段里的<br>换成<br />, 同时<p>换<hr>,把</p>全清除

一个用PHP实现的UBB类!

改进功能: 
  对字符串进行UBB编码,该类目前只支持下列几个简单且实用的编码: 
  1. URL裢接 
  http://www.phpexe.com/ 
  http://头可以不需要 
  如phpexe.com也是可以的。 
  2. Email裢接 
  demo@163.net 
  3. 图片裢接 
   
  同URL链接一样,前面的http也可以不要。 
  4. 文字方面 
  粗体字 
  斜体字 
  加下划线 
   
  1号标题字 
  ... 
  6号标题字 
   
   
   
  [tt][/tt] 
  [s][/s] 
   
  [em][/em] 
  [strong][/strong] 
  [code][/code] 
  [samp][/samp] 
  [kbd][/kbd] 
  [var][/var] 
  [dfn][/dfn] 
  [cite][/cite] 
   
   
   
  注意以下几点: 
  1. url,email,img等标签是不分大小写的. 
  2. 在标签中不允许有TAB键出现,但空格允许。 
  3. 该类要调用htmlencode,htmlencode4textarea,emailcheck函数和urlcheck类. 
  4. 修改后支持嵌套,但url,email,img这三个标签不是允许嵌套的。 
  技术资料: 
  Ultimate Bulletin Board 
  http://www.ultimatebb.com/ 
  What is UBB Code 
  http://www.scriptkeeper.com/ubb/ubbcode.html 
  */ 
   
  include("urlcheck.php"); 
  include("otherfunc.php"); //这两个文件的内容,附在最后。 
   
  //ubbcode类 
  class ubbcode{ 
  var $call_time=0; 
  //可处理标签及处理函数对应表 
  var $tags = array( //小写的标签 => 对应的处理函数 
  ’url’ => ’$this->url’, 
  ’email’ => ’$this->email’, 
  ’img’ => ’$this->img’, 
  ’b’ => ’$this->simple’, 
  ’i’ => ’$this->simple’, 
  ’u’ => ’$this->simple’, 
  ’tt’ => ’$this->simple’, 
  ’s’ => ’$this->simple’, 
  ’strike’ => ’$this->simple’, 
  ’h1’ => ’$this->simple’, 
  ’h2’ => ’$this->simple’, 
  ’h3’ => ’$this->simple’, 
  ’h4’ => ’$this->simple’, 
  ’h5’ => ’$this->simple’, 
  ’h6’ => ’$this->simple’, 
  ’sup’ => ’$this->simple’, 
  ’sub’ => ’$this->simple’, 
  ’em’ => ’$this->simple’, 
  ’strong’ => ’$this->simple’, 
  ’code’ => ’$this->simple’, 
  ’samp’ => ’$this->simple’, 
  ’kbd’ => ’$this->simple’, 
  ’var’ => ’$this->simple’, 
  ’dfn’ => ’$this->simple’, 
  ’cite’ => ’$this->simple’, 
  ’small’ => ’$this->simple’, 
  ’big’ => ’$this->simple’, 
  ’blink’ => ’$this->simple’ 
  ); 
  //url裢接属性 
  var $attr_url; 
  //url合法性检查对象 
  var $urlcheck; 
   
  function ubbcode($attr_url){ 
  $this->attr_url = ’’.$attr_url; 
  $this->urlcheck = new urlcheck(); 
  } 
   
  //对$str进行UBB编码解析 
  function parse($str){ 
  $this->call_time++; 
  $parse = ’’.htmlencode($str); 
   
  $ret = ’’; 
  while(true){ 
  $eregi_ret=eregi("[[#]{0,1}[[:alnum:]]{1,7}]",$parse,$eregi_arr); //查找[xx] 
  if(!$eregi_ret){ 
  $ret .= $parse; 
  break; //如果没有,返回 
  } 
  $pos = @strpos($parse,$eregi_arr[0]); 
  $tag_len=strlen($eregi_arr[0])-2;//标记长度 
  $tag_start=substr($eregi_arr[0],1,$tag_len); 
  $tag=strtolower($tag_start); 
   
  if((($tag=="url") or ($tag=="email") or ($tag=="img")) and ($this->call_time>1)){ 
  echo $this->call_time."<br>"; 
  return $parse;//如果不能是不能嵌套的标记,直接返回 
  } 
   
  $parse2 = substr($parse,0,$pos);//标记之前 
  $parse = substr($parse,$pos+$tag_len+2);//标记之后 
  if(!isset($this->tags[$tag])){ 
  echo "$tag_start<br>"; 
  $ret .= $parse2.’[’.$tag_start.’]’; 
  continue;//如果是不支持的标记 
  } 
   
  //查找对对应的结束标记 
  $eregi_ret=eregi("[/".$tag."]",$parse,$eregi_arr); 
  if(!$eregi_ret){ 
  $ret .= $parse2.’[’.$tag_start.’]’; 
  continue;//如果没有对应该的结束标记 
  } 
  $pos=strpos($parse,$eregi_arr[0]); 
  $value=substr($parse,0,$pos);//这是起止标记之间的内容 
  $tag_end=substr($parse,$pos+2,$tag_len); 
  $parse=substr($parse,$pos+$tag_len+3);//结束标记之后的内容 
   
  if(($tag!="url") and ($tag!="email") and ($tag!="img")){ 
  $value=$this->parse($value); 
  } 
   
  $ret .= $parse2; 
  eval(’$ret .= ’.$this->tags[$tag].’("’.$tag_start.’","’.$tag_end.’","’.$value.’");’); 
  } 
  $this->call_time--; 
  return $ret; 
  } 
   
  function simple($start,$end,$value){ 
  return ’<’.$start.’>’.$value.’</’.$end.’>’; 
  } 
   
  function url($start,$end,$value){ 
  $trim_value=trim($value); 
  if (strtolower(substr($trim_value,0,7))!="http://") 
  $trim_value="http://".$trim_value; 
  if($this->urlcheck->check($trim_value)) return ’<a href="’.$trim_value.’" ’.$this->attr_url.’>’.$value.’</a>’; 
  else return ’[’.$start.’]’.$value.’[/’.$end.’]’; 
  } 
   
  function email($start,$end,$value){ 
  if(emailcheck($value)) return ’<a href="mailto:’.$value.’">’.$value.’</a>’; 
  else return ’[’.$start.’]’.$value.’[/’.$end.’]’; 
  } 
   
  function img($start,$end,$value){ 
  $trim_value=trim($value); 
  if ((strtolower(substr($trim_value,0,7))!="http://") or ($this->urlcheck->check($trim_value))) 
  return ’<img src="’.$trim_value.’"></img>’; 
  else return ’[’.$start.’]’.$value.’[/’.$end.’]’; 
  } 
  } 
   
  //测试 
  echo ’<html>’; 
  echo ’<head><title>测试</title></head>’; 
  echo ’<body>’; 
  echo ’<form action="’.str2url($PATH_INFO).’" method="post">’; 
  echo ’<textarea cols="100" rows="10" name="ubb">’.htmlencode4textarea($ubb).’</textarea><br>’; 
  echo ’<input type="submit" value="转换">’; 
  echo ’</form>’; 
   
  if(isset($ubb)){ 
  $ubbcode = new ubbcode(’target="_blank"’); 
  echo ’<hr>’.$ubbcode->parse($ubb); 
  } 
   
  echo ’</body>’; 
  echo ’</html>’; 
   
  ?> 
   
  文件urlcheck.php的内容 
  <?php 
  //urlcheck.php 
  class urlcheck{ 
  var $regex = array(//协议名(注意在这里必须写成小写) => 对应的正则表达式 
  ’ftp’ => ’$this->ftpurl’, 
  ’file’ => ’$this->fileurl’, 
  ’http’ => ’$this->httpurl’, 
  ’https’ => ’$this->httpurl’, 
  ’gopher’ => ’$this->gopherurl’, 
  ’news’ => ’$this->newsurl’, 
  ’nntp’ => ’$this->nntpurl’, 
  ’telnet’ => ’$this->telneturl’, 
  ’wais’ => ’$this->waisurl’ 
  ); 
   
  var $lowalpha; 
  var $hialpha; 
  var $alpha; 
  var $digit; 
  var $safe; 
  var $extra; 
  var $national; 
  var $punctuation; 
  var $reserved; 
  var $hex; 
  var $escape; 
  var $unreserved; 
  var $uchar; 
  var $xchar; 
  var $digits; 
   
  var $urlpath; 
  var $password; 
  var $user; 
  var $port; 
  var $hostnumber; 
  var $alphadigit; 
  var $toplabel; 
  var $domainlabel; 
  var $hostname; 
  var $host; 
  var $hostport; 
  var $login; 
   
  //ftp 
  var $ftptype; 
  var $fsegment; 
  var $fpath; 
  var $ftpurl; 
   
  //file 
  var $fileurl; 
   
  //http,https 
  var $search; 
  var $hsegment; 
  var $hpath; 
  var $httpurl; 
   
  //gopher 
  var $gopher_string; 
  var $selector; 
  var $gtype; 
  var $gopherurl; 
   
  //news 
  var $article; 
  var $group; 
  var $grouppart; 
  var $newsurl; 
   
  //nntp 
  var $nntpurl; 
   
  //telnet 
  var $telneturl; 
   
  //wais 
  var $wpath; 
  var $wtype; 
  var $database; 
  var $waisdoc; 
  var $waisindex; 
  var $waisdatabase; 
  var $waisurl; 
   
  function check($url){ 
  $pos = @strpos($url,’:’,1); 
  if($pos<1) return false; 
  $prot = substr($url,0,$pos); 
  if(!isset($this->regex[$prot])) return false; 
  eval(’$regex = ’.$this->regex[$prot].’;’); 
  return ereg(’^’.$regex.’$’,$url); 
  } 
   
  function urlcheck(){ 
  $this->lowalpha = ’[a-z]’; 
  $this->hialpha = ’[A-Z]’; 
  $this->alpha = ’(’.$this->lowalpha.’|’.$this->hialpha.’)’; 
  $this->digit = ’[0-9]’; 
  $this->safe = ’[$.+_-]’; 
  $this->extra = ’[*()’!,]’; 
  $this->national = ’([{}|^~`]|\[|\])’; 
  $this->punctuation = ’[<>#%"]’; 
  $this->reserved = ’[?;/:@&=]’; 
  $this->hex = ’(’.$this->digit.’|[a-fA-F])’; 
  $this->escape = ’(%’.$this->hex.’{2})’; 
  $this->unreserved = ’(’.$this->alpha.’|’.$this->digit.’|’.$this->safe.’|’.$this->extra.’)’; 
  $this->uchar = ’(’.$this->unreserved.’|’.$this->escape.’)’; 
  $this->xchar = ’(’.$this->unreserved.’|’.$this->reserved.’|’.$this->escape.’)’; 
  $this->digits = ’(’.$this->digit.’+)’; 
   
  $this->urlpath = ’(’.$this->xchar.’*)’; 
  $this->password = ’((’.$this->uchar.’|[?;&=]’.’)*)’; 
  $this->user = ’((’.$this->uchar.’|[?;&=]’.’)*)’; 
  $this->port = $this->digits; 
  $this->hostnumber = ’(’.$this->digits.’.’.$this->digits.’.’.$this->digits.’.’.$this->digits.’)’; 
  $this->alphadigit = ’(’.$this->alpha.’|’.$this->digit.’)’; 
  $this->toplabel = ’(’.$this->alpha.’|(’.$this->alpha.’(’.$this->alphadigit.’|-)*’.$this->alphadigit.’))’; 
  $this->domainlabel = ’(’.$this->alphadigit.’|(’.$this->alphadigit.’(’.$this->alphadigit.’|-)*’.$this->alphadigit.’))’; 
  $this->hostname = ’((’.$this->domainlabel.’\.)*’.$this->toplabel.’)’; 
  $this->host = ’(’.$this->hostname.’|’.$this->hostnumber.’)’; 
  $this->hostport = ’(’.$this->host.’(:’.$this->port.’)?)’; 
  $this->login = ’((’.$this->user.’(:’.$this->password.’)?@)?’.$this->hostport.’)’; 
   
  $this->ftptype = ’[aidAID]’; 
  $this->fsegment = ’((’.$this->uchar.’|[?:@&=])*)’; 
  $this->fpath = ’(’.$this->fsegment.’(/’.$this->fsegment.’)*)’; 
  $this->ftpurl = ’([fF][tT][pP]://’.$this->login.’(/’.$this->fpath.’(;[tT][yY][pP][eE]=’.$this->ftptype.’)?)?)’; 
   
  $this->fileurl = ’([fF][iI][lL][eE]://(’.$this->host.’|[lL][oO][cC][aA][lL][hH][oO][sS][tT])?/’.$this->fpath.’)’; 
   
  $this->search = ’((’.$this->uchar.’|[;:@&=])*)’; 
  $this->hsegment = ’((’.$this->uchar.’|[;:@&=])*)’; 
  $this->hpath = ’(’.$this->hsegment.’(/’.$this->hsegment.’)*)’; 
  $this->httpurl = ’([hH][tT][tT][pP][sS]?://’.$this->hostport.’(/’.$this->hpath.’([?]’.$this->search.’)?)?)’; 
   
  $this->gopher_string = ’(’.$this->xchar.’*)’; 
  $this->selector = ’(’.$this->xchar.’*)’; 
  $this->gtype = $this->xchar; 
  $this->gopherurl = ’([gG][oO][pP][hH][eE][rR]://’.$this->hostport.’(/(’.$this->gtype.’(’.$this->selector.’(%09’.$this->search.’(%09’.$this->gopher_string.’)?)?)?)?)?)’; 
   
  $this->article = ’((’.$this->uchar.’|[;/?:&=])+@’.$this->host.’)’; 
  $this->group = ’(’.$this->alpha.’(’.$this->alpha.’|’.$this->digit.’|[-.+_])*)’; 
  $this->grouppart = ’([*]|’.$this->group.’|’.$this->article.’)’; 
  $this->newsurl = ’([nN][eE][wW][sS]:’.$this->grouppart.’)’; 
   
  $this->nntpurl = ’([nN][nN][tT][pP]://’.$this->hostport.’/’.$this->group.’(/’.$this->digits.’)?)’; 
   
  $this->telneturl = ’([tT][eE][lL][nN][eE][tT]://’.$this->login.’/?)’; 
   
  $this->wpath = ’(’.$this->uchar.’*)’; 
  $this->wtype = ’(’.$this->uchar.’*)’; 
  $this->database = ’(’.$this->uchar.’*)’; 
  $this->waisdoc = ’([wW][aA][iI][sS]://’.$this->hostport.’/’.$this->database.’/’.$this->wtype.’/’.$this->wpath.’)’; 
  $this->waisindex = ’([wW][aA][iI][sS]://’.$this->hostport.’/’.$this->database.’[?]’.$this->search.’)’; 
  $this->waisdatabase = ’([wW][aA][iI][sS]://’.$this->hostport.’/’.$this->database.’)’; 
  $this->waisurl = ’(’.$this->waisdatabase.’|’.$this->waisindex.’|’.$this->waisdoc.’)’; 
  } 
  } 
   
  ?> 
   
   
  文件otherfunc.php的内容 
  <?php 
  //otherfunc.php 
  function htmlencode($str){ 
  $str = (string)$str; 
   
  $ret = ’’; 
  $len = strlen($str); 
  $nl = false; 
  for($i=0;$i<$len;$i++){ 
  $chr = $str[$i]; 
  switch($chr){ 
  case ’<’: 
  $ret .= ’<’; 
  $nl = false; 
  break; 
  case ’>’: 
  $ret .= ’>’; 
  $nl = false; 
  break; 
  case ’"’: 
  $ret .= ’"’; 
  $nl = false; 
  break; 
  case ’&’: 
  $ret .= ’&’; 
  $nl = false; 
  break; 
  /* 
  case ’ ’: 
  $ret .= ’ ’; 
  $nl = false; 
  break; 
  */ 
  case chr(9): 
  $ret .= ’    ’; 
  $nl = false; 
  break; 
  case chr(10): 
  if($nl) $nl = false; 
  else{ 
  $ret .= ’<br>’; 
  $nl = true; 
  } 
  break; 
  case chr(13): 
  if($nl) $nl = false; 
  else{ 
  $ret .= ’<br>’; 
  $nl = true; 
  } 
  break; 
  default: 
  $ret .= $chr; 
  $nl = false; 
  break; 
  } 
  } 
   
  return $ret; 
  } 
   
   
  function htmlencode4textarea($str){ 
  $str = (string)$str; 
   
  $ret = ’’; 
  $len = strlen($str); 
  for($i=0;$i<$len;$i++){ 
  $chr = $str[$i]; 
  switch($chr){ 
  case ’<’: 
  $ret .= ’<’; 
  break; 
  case ’>’: 
  $ret .= ’>’; 
  break; 
  case ’"’: 
  $ret .= ’"’; 
  break; 
  case ’&’: 
  $ret .= ’&’; 
  break; 
  case ’ ’: 
  $ret .= ’ ’; 
  break; 
  case chr(9): 
  $ret .= ’    ’; 
  break; 
  default: 
  $ret .= $chr; 
  break; 
  } 
  } 
   
  return $ret; 
  } 
   
  function emailcheck($email){ 
  $ret=false; 
  if(strstr($email, ’@’) && strstr($email, ’.’)){ 
  if(eregi("^([_a-z0-9]+([\._a-z0-9-]+)*)@([a-z0-9]{2,}(\.[a-z0-9-]{2,})*\.[a-z]{2,3})$", $email)){ 
  $ret=true; 
  } 
  } 
  return $ret; 
  } 
   
  function str2url($path){ 
  return eregi_replace("%2f","/",urlencode($path)); 
  } 
  ?>  

 

最近老朱在做flex日志发布系统,需要在后台用PHP生成XML,本来是一个实习生负责的不过好像和我做没啥区别。

生成XML这块非常简单,按老朱给的格式输出相应的字符串就行了,值得注意的只是要加下行
header("Content-type: text/xml; charset=utf-8");
表示要输出的是个xml文件而不是通常的html格式。

还有一个要求是需要在所有的链接中插入一个span标签,如:
<a href="1.php">页面</a>

全要改成

<a href="1.php"><span class="link">页面</span></a>的形式。

如果用字符串函数去做的话非常麻烦而且准确度估计很勉强,用preg_match_all可以提出所有的链接文本但是却不好替换回去,查了一下资料,用preg_replace能很好的解决这个问题。

PHP代码
  1. $str = preg_replace("/(<a.*?>)(.*?)(</a>)/"(i)1<span class="link">2</span>3(i)$str);  

 其中用了三个子模式(每个圆括号中内容为一个子模式),第一个是链接开始标签,第二个是链接文本,第三个是</a>

然后第二个参数中1、2、3就表示这三个部分,要替换成什么样子还不简单?


获取页面中的所有链接地址的PHP函数 
    下面这个用PHP写的函数,可以获取任意的字符串$string中的所有链接地址($string可以是从一个HTML页面文件直接读取出来的字符串),结果保存在一个数组中返回.该函数自动把电子邮件地址排除在外,而且返回的数组中不会有重复元素. 

function GetAllLink($string) 

  $string = str_replace(" ","",$string); 
  $string = str_replace(" ","",$string); 
   
  $regex[url] = "((http|https|ftp|telnet|news)://)?([a-z0-9_-/.]+.[][a-z0-9:;&#@=_~%?/.,+-]+)";  
  $regex[email] = "([a-z0-9_-]+)@([a-z0-9_-]+.[a-z0-9-._-]+)";   

  //去掉标签之间的文字 
  $string = eregi_replace(">[^<>]+<","><", $string);        
   
  //去掉JAVASCRIPT代码 
  $string = eregi_replace("<!--.*//-->","", $string); 
   
  //去掉非<a>的HTML标签   
  $string = eregi_replace("<[^a][^<>]*>","", $string);  
  
  //去掉EMAIL链接        
  $string = eregi_replace("<a([ ]+)href=(["’]*)mailto:($regex[email])(["’]*)[^>]*>","", $string);  
   
  //替换需要的网页链接  
  $string = eregi_replace("<a([ ]+)href=(["’]*)($regex[url])(["’]*)[^>]*>","\3 ", $string);  

  $output[0] = strtok($string, " "); 
  while(($temp = strtok(" "))) 
  { 
    if($temp && !in_array($temp, $output)) 
      $output[++$i] = $temp; 
  } 

  return $output; 
}  
  
 

"

相关推荐

  • 网友评论

    • (*)

    最新评论