php 截取字符串函数(中文字符串)(1/2)

 更新时间:2016年11月25日 17:33  点击:1972
这是一款php 截取字符串函数哦,支持中文字符串哦,它可以截取html与中西文,等混合的内容,并且把html标签不算在字符截取之内,如果html标签没有闭合,程序将自动过滤多余的标签。
 代码如下 复制代码

function mysubstr( $str, $length ){
   
    $tagcnt = 0;
    $charcnt = 0;
    $tag = '';
    $maxlen = strlen( $str );
    $resultstr = '';
    $tagstack = array();

    for( $i = 0; $i < $length; $i++ ){
        if( $str[$i] == '<' ){

            $resultstr .= $str[$i];

            for( $j=$i; $str[$j]!='>'; $j++,$length++ ){
                $tag .= $str[$j];
            }
            $tagcnt++;
            $length++;
            $tag .= '>';
           
            //如果是开始标记,则入栈,如果是与之相对应的结束标记则出栈
            if( preg_match('/<([^/]+)?>/i', $tag, $r) ){
                echo '入栈:',htmlspecialchars($r[1]),'<br />';
                array_push($tagstack, $r[1]);
            }
            elseif( preg_match( '/'.$tagstack[count($tagstack)-1].'/', $tag ) ){
                echo '出栈:',htmlspecialchars($tagstack[count($tagstack)-1]),'<br />';
                array_pop( $tagstack );
            }

            $tag = '';
            continue;
        }

        $charcnt++;
        $resultstr .= $str[$i];
    }

   
    echo '<hr size=1>最后结果为:';

    //栈是空的直接返回
    if(empty($tagstack)){
        return $resultstr;
    }
    //否则去掉没有结束标记的开始标记
    else{
       
        while(!empty($tagstack)){

            $tag = array_pop($tagstack);

            $index = strrpos($resultstr, $tag);

            for($i = $index-1; $resultstr[$i] != '>'; $i++ ){
                $resultstr[$i] = '';
            }

            $resultstr[$i++] = '';
       
        }

        return $resultstr;
    }
   
}

$sttime = microtime(true);

$stmem = memory_get_usage();

$str = "a1<body>b2<p>c3<em>d4</em>e5</p>f6</body>g7h8";

echo '处理结果为:<br/><hr size=1>',htmlspecialchars( mysubstr( $str, 18 ) ),'<br />';

echo "内存使用情况:",(memory_get_usage()-$stmem),'<br />';

echo "算法运行时间(microtime):",(microtime(true)-$sttime),'<br/>';

//方法二

/

 代码如下 复制代码

**
 * 函数名 html_substr
 * 功能 从html串中截取指定长度的字串,html标记不计算在内
 * 参数
 *  $str 要截取的串
 *  $len 要截取的长度
 *  $mode 不匹配的标记的处理方式 0 删去(默认),1 补齐
 * 返回 截取到的串
 * 说明
 *  未考虑多字节字符,仅已字节做计数单位
 *  未考虑可单独存在的标记
 **/
function html_substr($str, $len, $mode=0) {
  $ar= preg_split('/(<!--.*-->|<[^>]*>)/s', $str, -1, preg_split_delim_capture);
  foreach($ar as $k => $v) {
    if($v{0} != '<') {
      $len = $len - strlen($v);
      if($len < 0) $ar[$k] = substr($v, 0, $len);
    }else $ar[$k] = strtolower($v);
    if($len <= 0) break;
  }
  $ar = array_slice($ar, 0, $k+1);
  $len = count($ar);
  foreach($ar as $k=>$v) {
    if($v{0} == '<' && $v[1] != '/') {
      $ch = str_replace('<', '</', $v);
      for($i=$k+1; $i<$len && $ar[$i]!=$ch; $i++);
      if($i == $len)
        if($mode)
          $ar[$len] = $ch . $ar[$len];
        else
          $ar[$k] = '';
    }
  }
  return join('', $ar);
}
$str = "123<em>abc</em>456<em>def</em>789";

echo '<xmp>';
echo html_substr($str, 5) . php_eol;
echo html_substr($str, 5, 1);

 

本文章要讲的php 缓存技术是讲把数据生成一个临时缓存文件保存到硬盘,然后根据缓存文件设定的时间删除缓存文件再次生成新的缓存文件哦。

 代码如下 复制代码

$filename = 'cachefile.php';
$str ='echo "bb";';
if( is_file( $filename ) )
{
 $tmp = readcache( $filename ) ;
}
else
{
 createcache( $filename,$str );
}

//写缓存文件

function createcache($filename,$str)
{
 if( $str =='' ){ return false;}
 $fp = fopen($filename,"w+") or die('缓存目录不可能,请设置/www.111cn.net/cache为可写权限!');
 if( ! fwrite($fp,$str) )
 {
  echo '不能创建缓存文件!';
  exit;
 }
 fclose($fp);  
}

//读取缓存文件

function readcache($filename)
{
 $str = file_get_contents($filename);
 if( $str == "" )
 {
  echo "缓存文件读取失败!";
  exit;
 }
 return $str;
}

/*
本站原创文章,转载注明来源http://www.111cn.net/phper/php.html
*/

/*
create table `member` (
  `member_account` varchar(25) collate utf8_unicode_ci not null,
  `member_password` varchar(32) collate utf8_unicode_ci not null,
  `member_name` varchar(20) collate utf8_unicode_ci not null,
  `sex` varchar(1) collate utf8_unicode_ci not null,
  `schoolnumber` varchar(10) collate utf8_unicode_ci not null,
  `phonenumber` varchar(15) collate utf8_unicode_ci not null,
  `email` varchar(50) collate utf8_unicode_ci not null,
  unique key `member_account` (`member_account`)
) engine=innodb default charset=utf8 collate=utf8_unicode_ci;

*/
?>

 代码如下 复制代码

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>会员注册</title>
</head>

<body>
<div align="center"><font face="楷书" size="+3">会员注册</font></div>
<form id="form1" name="form1" method="get" action="register_get.php">
  <table width="695" border="1" align="center" cellpadding="1" cellspacing="1">
    <tr>
      <td width="167">账号:(account)</td>
      <td width="416"><input name="m_acct" type="text" id="m_acct" value="<?php if(!empty($_get['m_acct']))
echo $_get['m_acct'];
?>" maxlength="20" />
  <font color="#ff0000"> *</font>(由20个数字或字母组成)</td>
    </tr>
    <tr>
      <td>密码:(password)</td>
      <td><input name="m_pw" type="password" id="m_pw" maxlength="20" />
      <font color="#ff0000"> *</font>(由20个数字或字母组成)</td>
    </tr>
    <tr>
      <td>确认密码(password)</td>
      <td><input type="password" name="pass" id="pass" />
      <font color="#ff0000"> *</font>(再次输入密码)</td>
    </tr>
    <tr>
      <td>真实姓名:(name)</td>
      <td><input type="text" name="m_name" id="m_name" value="<?php if(!empty($_get['m_name']))
echo $_get['m_name'];
?>" /></td>
    </tr>
    <tr>
      <td>性别:(sex)</td>
      <td align="left"><p>
        <label>
          <input name="m_sex" type="radio" id="radiogroup1_0" value="男" />
          男</label>
        <label>
          <input type="radio" name="m_sex" value="女" id="radiogroup1_1" />
          女&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"> *</font></label>
</td>
    </tr>
    <tr>
      <td>学号:(school number)</td>
      <td><input type="text" name="m_snum" id="m_snum" value="<?php if(!empty($_get['m_snum']))
echo $_get['m_snum'];
?>" /></td>
    </tr>
    <tr>
      <td>手机号码:(mobil phone)</td>
      <td><input type="text" name="m_pnum" id="m_pnum" value="<?php if(!empty($_get['m_pnum']))
echo $_get['m_pnum'];
?>"/></td>
    </tr>
    <tr>
      <td>电子邮箱:(email)</td>
      <td><input type="text" name="m_email" id="m_email" value="<?php if(!empty($_get['m_email']))
echo $_get['m_email'];
?>"/></td>
    </tr>
    <tr>
      <td colspan="2" align="center"><input type="reset" name="button" id="button" value="重置表单" />
      <input type="submit" name="button2" id="button2" value="确定注册" /></td>
    </tr>
  </table>
</form></p>
<p align="center">以上打"*"为必填项</p>
</body>
</html>

register_get.php文件
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>提示</title>
</head>
<?php
if(empty($_get['m_acct']))
echo "账号不能为空!<a href='register.php?m_name=".$_get['m_name']."&m_sex=".$_get['m_sex']."&m_snum=".$_get['m_snum']."&m_pnum=".$_get['m_pnum']."'>返回重新注册。</a></p>";
else if(empty($_get['m_pw']))
echo "密码不能为空!<a href='register.php?m_acct=".$_get['m_acct']."&m_name=".$_get['m_name']."&m_sex=".$_get['m_sex']."&m_snum=".$_get['m_snum']."&m_pnum=".$_get['m_pnum']."&m_email=".$_get['m_email']."'>返回重新注册。</a></p>";
else if($_get['m_pw']!=$_get['pass'])
echo "两次输入的密码不一样,<a href='register.php?m_acct=".$_get['m_acct']."&m_name=".$_get['m_name']."&m_sex=".$_get['m_sex']."&m_snum=".$_get['m_snum']."&m_pnum=".$_get['m_pnum']."'>返回重新注册。</p>";
else if(empty($_get['m_sex']))
echo "未输入性别,<a href='register.php?m_acct=".$_get['m_acct']."&m_name=".$_get['m_name']."&m_snum=".$_get['m_snum']."&m_pnum=".$_get['m_pnum']."'>返回重新注册。</a></p>";
else if(!empty($_get['m_snum'])&&!is_numeric($_get['m_snum']))
echo "学号必须全为数字,<a href='register.php?m_acct=".$_get['m_acct']."&m_name=".$_get['m_name']."&m_sex=".$_get['m_sex']."&m_pnum=".$_get['m_pnum']."'>返回重新注册。</a></p>";
else if(!empty($_get['m_pnum'])&&!is_numeric($_get['m_pnum']))
echo "手机号码必须全为数字,<a href='register.php?m_acct=".$_get['m_acct']."&m_name=".$_get['m_name']."&m_sex=".$_get['m_sex']."&m_snum=".$_get['m_snum']."'>返回重新注册。</a></p>";
else if(!empty($_get['m_email'])&&!ereg("([0-9a-za-z]+)([@])([0-9a-za-z]+)(.)([0-9a-za-z]+)",$_get['m_email']))
echo "邮箱输入不合法!<a href='register.php?m_acct=".$_get['m_acct']."&m_name=".$_get['m_name']."&m_sex=".$_get['m_sex']."&m_snum=".$_get['m_snum']."&m_pnum=".$_get['m_pnum']."'>返回重新注册。</a></p>";
else
{
require_once ('inc.php');
$_session['pass']="ok";
$_session['member']=$_get['m_acct'];
$link = getdblink();
$sql="insert into member values('".$_get['m_acct']."','".md5($_get['m_pw'])."','".$_get['m_name']."','".$_get['m_sex']."','".$_get['m_snum']."','".$_get['m_pnum']."','".$_get['m_email']."')";
$result=mysql教程_query($sql)or die(mysql_error());
if($result>0)
echo "".$_get['m_name'].",恭喜你注册成功,<a href='member_index.php'>马上进入主页面...</p>";
else
{
 $_session['pass']="no pass";
 echo "注册失败!<a href-'register.php'>重新注册。</a></p>";
 mysql_close();
}
}
?>
<body>
</body>
</html>

本款php计数器是一款用来统计网页的访问次数的简单的讲数器代码,利用txt文本文件与php fopen函数进行操作。

 

 代码如下 复制代码

$log = 'log/count.txt';
 $count_img = 'img/counter';

 $fp = @fopen($log, "r+") or die($log.'数据文件不能打开!');
 $count = fgets($fp, 64);
 flock($fp, 2);
 $count = (int)$count + 1;
 rewind($fp);
 fputs($fp, $count);
 fclose($fp);
 if($conf_showcount == '1'){
  for ($i=0; $i<strlen($count); $i++){
   $num = substr($count, $i, 1);
   echo '<img src="'.$count_img.'/'.$num.'.gif">';
  }
 }

 代码如下 复制代码
class ajaxpage{
var $result;
 var $anchors;
 var $total;
 var $db;
 var $网页特效p/jsp.html target=_blank >jsp教程agination;
 function __construct($qry,$starting,$recpage,$jspagination)
 {  
     $this->db   =   &$globals['db'];
  $this->jspagination =  $jspagination;
  $rst  = $this->db->query($qry);
  $numrows = $this->db->num_rows;
  $qry   .= " limit $starting, $recpage";
  
  $this->result = $this->db->get_results($qry,array_a);
  
  $next  = $starting+$recpage;//the number next time end
  //$var  = ((intval($numrows/$recpage))-1)*$recpage;
  $page_showing = intval($starting/$recpage)+1;//the str shows on the page bar
  $total_page = ceil($numrows/$recpage); //total page
  if($numrows % $recpage != 0){
   $last = ((intval($numrows/$recpage)))*$recpage;
  }else{
   $last = ((intval($numrows/$recpage))-1)*$recpage;
  }
  $previous = $starting-$recpage;
  $anc = "<ul id='pagination-flickr'>";
  if($previous < 0){
   $anc .= "<li class='previous-off'>first</li>";
   $anc .= "<li class='previous-off'>previous</li>";
  }else{
   $anc .= "<li class='next'><a href='网页特效:$this->jspagination(0);'>first </a></li>";
   $anc .= "<li class='next'><a href='javascript:$this->jspagination($previous);'>previous </a></li>";
  }
  
  ################if you dont want the numbers just comment this block############### 
  
  $norepeat = 3;//no of pages showing in the left and right side of the current page in the anchors
  $j = 1;
  $anch = "";
  for($i=$page_showing; $i>1; $i--){
   $fpreviouspage = $i-1;
   $page = ceil($fpreviouspage*$recpage)-$recpage;
   $anch = "<li><a href='javascript:$this->jspagination($page);'>$fpreviouspage </a></li>".$anch;
   if($j == $norepeat) break;
   $j++;
  }
  $anc .= $anch;
  $anc .= "<li class='active'>".$page_showing."</li>";
  $j = 1;
  for($i=$page_showing; $i<$total_page; $i++){
   $fnextpage = $i+1;
   $page = ceil($fnextpage*$recpage)-$recpage;
   $anc .= "<li><a href='javascript:$this->jspagination($page);'>$fnextpage</a></li>";
   if($j==$norepeat) break;
   $j++;
  }
  
  ############################################################
  if($next >= $numrows){
   $anc .= "<li class='previous-off'>next</li>";
   $anc .= "<li class='previous-off'>last</li>";
  }else{
   $anc .= "<li class='next'><a href='javascript:$this->jspagination($next);'>next </a></li>";
   $anc .= "<li class='next'><a href='javascript:$this->jspagination($last);'>last</a></li>";
  }
   $anc .= "</ul>";
  $this->anchors = $anc;
  
  $this->totalstr = "page : $page_showing <i> of  </i> $total_page . total records found: $numrows";
 }
}
[!--infotagslink--]

相关文章

  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • c#中判断字符串是不是数字或字母的方法

    这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
  • PostgreSQL判断字符串是否包含目标字符串的多种方法

    这篇文章主要介绍了PostgreSQL判断字符串是否包含目标字符串的多种方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • php字符串按照单词逐个进行反转的方法

    本文实例讲述了php字符串按照单词进行反转的方法。分享给大家供大家参考。具体分析如下:下面的php代码可以将字符串按照单词进行反转输出,实际上是现将字符串按照空格分隔到数组,然后对数组进行反转输出。...2015-03-15
  • 使用list stream: 任意对象List拼接字符串

    这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
  • MySQL 字符串拆分操作(含分隔符的字符串截取)

    这篇文章主要介绍了MySQL 字符串拆分操作(含分隔符的字符串截取),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-22
  • C# 16 进制字符串转 int的方法

    这篇文章主要介绍了C# 16 进制字符串转 int的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 获取中文字符串的实际长度代码

    JS中默认中文字符长度和其它字符长度计算方法是一样的,但某些情况下我们需要获取中文字符串的实际长度,代码如下: 复制代码 代码如下: function strLength(str) { var realLength = 0, len = str.length, charCode = -1;...2014-06-07
  • C#实现字符串转换成字节数组的简单实现方法

    这篇文章主要介绍了C#实现字符串转换成字节数组的简单实现方法,仅一行代码即可搞定,非常简单实用,需要的朋友可以参考下...2020-06-25
  • php 中英文混合字符串截取

    文章介绍一个实用的函数,我们如果用php substr来截取字符在中文上处理的很有问题,今天自己写了一个比较好的中文与英文字符截取的函数,有需要的朋友可以参考下。 ...2016-11-25
  • C#实现对字符串进行大小写切换的方法

    这篇文章主要介绍了C#实现对字符串进行大小写切换的方法,涉及C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • PostgreSQL 字符串处理与日期处理操作

    这篇文章主要介绍了PostgreSQL 字符串处理与日期处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-01
  • c#将字节数组转成易读的字符串的实现

    这篇文章主要介绍了c#将字节数组转成易读的字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C#获取字符串后几位数的方法

    这篇文章主要介绍了C#获取字符串后几位数的方法,实例分析了C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C#判断一个字符串是否是数字或者含有某个数字的方法

    这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 【C#基础】Substring截取字符串的方法小结(推荐)

    这篇文章主要介绍了Substring截取字符串方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 使用PHP similar text计算两个字符串相似度

    在网站开发中,我们经常使用php similar text 计算两个字符串相似度;1,similar_text的用法 如果我想计算"ly89cn"和"ly89"的相似程度,有两种表示方法复制代码 代码如下: echo similar_text('ly89cn', 'ly89'); ...2015-11-08
  • C#实现将字符串转换成日期格式的方法

    这篇文章主要介绍了C#实现将字符串转换成日期格式的方法,涉及C#操作时间及字符串的相关技巧,非常简单实用,需要的朋友可以参考下...2020-06-25
  • C# 16进制与字符串、字节数组之间的转换

    在串口通讯过程中,经常要用到 16进制与字符串、字节数组之间的转换...2020-06-25