首页 > 编程技术 > php

php substr(),explode(),strrev()

发布时间:2016-11-25 16:48

substr(str,start,length); 

例:substr('php教程 is very good language',4,5);

输出为 is ve;

当start>str的长度,则返回为();

substr('php is very good language',26,5);

substr('php is very good language',4);

输出为        (空白)

输出为is v     (表明start和langth都为4)

当start为负值,则从str末尾出开始读起(*这时是从-1开始读,而不是从0开始),

substr('php is very good language',-4,5);

输出为uage

当length为负值时,length代表的是从末尾开始读,截取str的结束位置。

substr('php is very good language',4,-5);

输出为is very good lan

explode()把函数字符串分割为数组;

// example 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

// example 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $gecos."<br>"; // foo
echo $shell; // *

strrev()把字符串从后往前输出

echo strrev("june"); // outputs "enuj"

setlocalhost(content location)设置本地环境.content ,指定需要设置的场景信息常量有(

lc_all – 所有下属的常量
lc_collate – 排列顺序
lc_ctype – 字符分类和转换(例如:将所有的字符转换成小写或大写形式)
lc_messages – 系统信息格式
lc_monetary – 货币 / 通货格式
lc_numeric – 数值格式
lc_time – 日期和时间格式
);location,设置国家区域,例如,chs.

$str = '数组1,数组2,数组3,数组4';
$array = explode(',',$str); //将规律字符串存入数组

explode() 函数把字符串分割为数组。

语法
explode(separator,string,limit)参数 描述
separator 必需。规定在哪里分割字符串。
string 必需。要分割的字符串。
limit 可选。规定所返回的数组元素的最大数目。


$array = array_diff($array,array('数组2')); //删除指定值的数组项

array_diff()函数比较两个或多个数组,如果第一个数组中的键或值在第二个数组中并未出现,则以一个数组的形式返回这个未在第二个数组中出现的键和值。

syntax
语法
array_diff(array1,array2,array3...)

parameter
参数 description
描述
array1 required. the first array is the array that the others will be compared with
必要参数。指定第一个参与比较的基准数组
array2 required. an array to be compared with the first array
必要参数。指定与第一个数组相比较的第二个数组
array3 optional. an array to be compared with the first array
可选参数。指定与第一个数组相比较的第三个数组


$str = implode(',',$array); //将数组存为规律字符串

implode() 函数把数组元素组合为一个字符串。

语法
implode(separator,array)参数 描述
separator 可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
array 必需。要结合为字符串的数组。

说明
虽然 separator 参数是可选的。但是为了向后兼容,推荐您使用使用两个参数。

echo $str;

 

 

<?php教程
//测试时文件的编码方式要是utf8
$str='中文a字1符';
echo strlen($str).'<br>';//14
echo mb_strlen($str,'utf8').'<br>';//6
echo mb_strlen($str,'gbk').'<br>';//8
echo mb_strlen($str,'gb2312').'<br>';//10
?>

结果分析:在strlen计算时,对待一个utf8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14,在mb_strlen计算时,选定内码为utf8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6 .
利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1)
echo (strlen($str) + mb_strlen($str,'utf8')) / 2;
例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.
echo mb_internal_encoding();
php内置的字符串长度函数strlen无法正确处理中文字符串,它得 到的只是字符串所占的字节数。对于gb2312的中文编码,strlen得到的值是汉字个数的2倍,而对于utf-8编码的中文,就是3倍的差异了(在 utf-8编码下,一个汉字占3个字节)。
采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和 strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到utf-8的字符串$str长度,可以用 mb_strlen($str,'utf-8')。如果省略第二个参数,则会使用php的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。需要注意的是,mb_strlen并不是php核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

php教程 substr_replace替换指定位置字符与内存破坏漏洞

提示和注释
注释:如果 start 是负数且 length 小于等于 start,则 length 为 0。

$username = "zongzi"; 
echo substr_replace($username,'**','1','2');

定义和用法
substr_replace() 函数把字符串的一部分替换为另一个字符串。

语法
substr_replace(string,replacement,start,length)参数 描述
string 必需。规定要检查的字符串。
replacement 必需。规定要插入的字符串。
start 必需。规定在字符串的何处开始替换。

正数 - 在第 start 个偏移量开始替换
负数 - 在从字符串结尾的第 start 个偏移量开始替换
0 - 在字符串中的第一个字符处开始替换
 
charlist 可选。规定要替换多少个字符。

正数 - 被替换的字符串长度
负数 - 从字符串末端开始的被替换字符数
0 - 插入而非替换
 
功能同 php的substr_replace()

'参数:被替换的内容,替换内容,起始位,替换长度

function substr_replace(sourcecon,repcon,startx,lenx)
   dim reped
   reped = mid(sourcecon,startx,lenx) '取出原内容同样长度
   dim scleftx,scleft
   scleftx = startx-1
   if scleftx<1 then
    scleft = ""
   else
    scleft = left(sourcecon,scleftx)
   end if
   substr_replace = replace(sourcecon,reped,repcon,startx,1)
   substr_replace = scleft&substr_replace
end function

()中断内存破坏漏洞
bugraq id:
cve id:cve-2010-2190
cncve id:cncve-20102190
 
漏洞发布时间:2010-05-31
漏洞更新时间:2010-06-28
 
漏洞起因
设计错误
危险等级

 
影响系统
php 5.2 <= 5.2.13
php 5.3 <= 5.3.2
 
不受影响系统
 
危害
远程攻击者可以利用漏洞泄漏敏感信息。
 
攻击所需条件
攻击者必须访问使用substr_replace()函数的应用程序。
 
漏洞信息
php是一款流行的网络编程语言。
php的substr_replace()函数存在信息泄漏问题:

php_function(substr_replace)
{
    ...
    if (zend_parse_parameters(zend_num_args() tsrmls_cc, "zzz|z", &str, &repl, &from, &len) == failure) {
        return;
    }
   
    if (z_type_pp(str) != is_array) {
        convert_to_string_ex(str);
    }
    if (z_type_pp(repl) != is_array) {
        convert_to_string_ex(repl);
    }
    if (z_type_pp(from) != is_array) {
        convert_to_long_ex(from);
    }
    if (argc > 3) {
        separate_zval(len);
        if (z_type_pp(len) != is_array) {
            convert_to_long_ex(len);
            l = z_lval_pp(len);
        }
    } else {
        if (z_type_pp(str) != is_array) {
            l = z_strlen_pp(str);
        }
    }
    if (z_type_pp(str) == is_string) {
        if (
            (argc == 3 && z_type_pp(from) == is_array) ||
            (argc == 4 && z_type_pp(from) != z_type_pp(len))
        ) {
            php_error_docref(null tsrmls_cc, e_warning, "'from' and 'len' should be of same type - numerical or array ");
            return_stringl(z_strval_pp(str), z_strlen_pp(str), 1);     
        }

使用不同类型的‘from’和'len'参数调用substr_replace()函数,会触发e_warning错误。如果php没有删除调用时通过引用传递功能,用户空间错误处理器会使用这个中断更改'str'参数类型。如果'str'类型更改为整数类型可导致泄漏任意内存,如果'str'更改为数组,允许泄漏使用重要内存偏移的哈希表。

、__wakeup 详解

1、__call
__call( $method, $arg_array ) 当调用一个未定义的方法是调用此访求

php教程5 的对象新增了一个专用方法 __call(),这个方法用来监视一个对象中的其它

方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。

例七:__call

<?php
class foo {
  function __call($name,$arguments) {
    print("did you call me? i'm $name!");
  }
} $x = new foo();
$x->dostuff();
$x->fancy_stuff();
?>

这个特殊的方法可以被用来实现“过载(overloading)”的动作,这样你就可以检

查你的参数并且通过调用一个私有的方法来传递参数。


2、__autoload
__autoload 函数,它会在试图使用尚未被定义的类时自动调用。

看下面的实例

写好了一个msyql类,

mysql教程.php

class mysql{
     funciton __construct(){
      ............
    }
}


现在我在index.php页面要用到mysql 类,我就这样,

function __authload($class){
      include_once("path".$class.".php");
}

$mysql=new mysql();

?>
include_once("path/".$class.".php");

path/   是类文件所在路径

$class 就是调用时的类名啦

后面的.php 当然是扩展名啦,

一个类文件可能感觉不到有多好用,如果类文件很多的时候,

每个类都要include一下,那太麻烦了,只要每个页面之前写一个 __autoload() 即

可,

通过调用此函数,脚本引擎在 php 出错失败前有了最后一个机会加载所需的类。

3、__construct、__destruct


构造函数与析构函数[__construct __destruct()]哦,他在在类class中的作用是

初始化与销毁变量下面我们来看看实例以

class db

{

  function __construct()
  {           
     
   $this->mconnid=mysql_connect ($this->dbhost,$this->dbuser,$this-

>dbpwd);//建立连接

            mysql_select_db($this->dbname, $this->mconnid);    //选择数

据库

            mysql_query("set names 'gbk'");//设置数据库教程编码为gbk

        }
       
        //__destruct:析构函数,断开连接

 function __destruct()
  {
            mysql_close($this->mconnid); //此处还有问题......

        }
 }

这时我们在用时就不需要考虑数据连接与关闭了,只要$aa = new db();就ok了。

更多详细内容请查看:

http://www.111cn.net/phper/18/aa7fc14039d6f49b02c646638588be7f.htm

4、__clone

__clone魔术方法

我们知道对象是可以直接赋值的,比如
$p2 = $p1;   //这里是一个对象有两个引用

那么我执行:

$p1->say();
$p2->say();

是都可以执行的,而且效果一样。
我们还有一种方法:
$p3 = clone $p1;     //注意clone是克隆关键字,这里与上面的不同是$p3是一

个新的对象。

同时我们在类里加入一个方法:

function __clone()
{
$this->name = “我是副本”;  //注意:这里的$this是克隆产生的对象本身,不

是当前类
}

然后我们执行:

$p3->say();

打印出

name:我是副本
age:20

到这里我们明白,__clone()方法是在克隆对象的时候执行的方法,它的作用是对

新克隆出来的副本
进行属性初始化等操作。

 

5、__tostring

__tostring方法在将一个对象转化成字符串时自动调用

如果我有一个类:

class person
{
private $name = “”;
private $age = 0;

function __construct($name = “”, $age = “”)
{
$this->name = $name;
$this->age = $age;
}

function say()
{
echo “name:”.$this->name.”<br/>”.”age:”.$this->age.”<br/>”;  
}
}

现在我去实例化这个类,然后去打印这个实例:

$p1 = new person(“liuzy”,20);
echo $p1;  //直接打印会出错

显然这样直接打印对象是会出现错误的,因为对象是引用句柄,不能直接打印。这

时,我们可以用到__tostring()方法。我们在person类里加一个__tostring()方法


function __tostring()
{
return “i am  person,my name is “.$this->name.”<br/>”;
}

然后再刷新页面,发现什么了?
现在我们明白,__tostring()是在直接打印对象时执行的方法,我们可以用该方法

打印类的一些相关信息。注意:是两个下划线,方法必须有返回值


6、__sleep、__wakeup
__sleep 串行化的时候用
__wakeup 反串行化的时候调用

在php进行序列化时,serialize() 检查类中是否有 __sleep() ,如果有,则该函

数将在任何序列化之前运行。该函数必须返回一个需要进行序列化保存的成员属性

数组,并且只序列化该函数返回的这些成员属性. 该函数有两个作用: 第一. 在序

列化之前,关闭对象可能具有的任何数据库连接等. 第二. 指定对象中需要被序列

化的成员属性,如果某个属性比较大而不需要储存下来,可以不把它写进__sleep要

返回的数组中,这样该属性就不会被序列化

相反地,unserialize() 从字节流中创建了一个对象之后,马上检查是否具有

__wakeup 的函数的存在。如果存在,__wakeup 立刻被调用。使用 __wakeup 的目

的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

<?php
   class user
   {
       public $name;
       public $id;

       function __construct()
       {
           $this->id = uniqid();          //give user a unique id 赋予一

个不同的id
       }

       function __sleep()
       {   
           return(array("name"));        //do not serialize this->id 不

串行化id
       }

       function __wakeup()
       {
           $this->id = uniqid();         //give user a unique id
       }
   }

   $u = new user;
   $u->name = "haha";

   $s = serialize($u);                   //serialize it 串行化 注意不串

行化id属性,id的值被抛弃

   $u2 = unserialize($s);                //unserialize it 反串行化 id被

重新赋值

  
   //$u and $u2 have different ids $u和$u2有不同的id
   var_dump($u);                        
   var_dump($u2);
?>

---------- php debug ----------
object(user)#1 (2) {
["name"]=>
string(4) "haha"
["id"]=>
string(13) "47fa045529f69"
}
object(user)#2 (2) {
["name"]=>
string(4) "haha"
["id"]=>
string(13) "47fa04552a49a"
}

标签:[!--infotagslink--]

您可能感兴趣的文章: