php字符串的长度计算、截取、分割

来源:互联网 发布:socket多线程编程java 编辑:程序博客网 时间:2024/05/22 14:50


1.php计算字符串长度函数 

php 字符串长度函数,在php测试字符串长度的函数有二个,
一个是strlen,另一个是mb_strlen前一个默认是支持,后一个需要开启一个插件,下面我们来介绍一下二个函数的区别与应用方法。

列如:

$str = '你好我好www';
echo strlen($str)."<br>".mb_strlen($str,'utf-8');

//返回结果:
15       //4*3+3
7         //4+3


字符串长度函数

strlen() 函数返回字符串的长度。

语法
strlen(string)参数 描述
string 必需。规定要检查的字符串。

    echo strlen("www.baidu.com"); //13
    echo strlen("中国人!");//6 strlen得到的值是汉字个数的2倍(utf-8编码下,一个汉字占3个字符;GBK编码下,一个汉字占2个字符)


2.PHP定位字符串出现的位置


计算字符串的长度或定位字符串出现的位置。


相关函数如下:

    strlen():取得字符串的长度
    strpos():定位字符串第一次出现的位置
    strrpos():定位字符串最后一次出现的位置


strlen() 函数用于取得字符串的长度,返回一个整型。

语法:

string substr( string string )

例子:

<?php
echo strlen('abc def');        //输出 7
echo strlen('ab北京');        //输出 6 ,UTF-8编码下输出 8
?>

strpos() 函数用于定位字符串第一次出现的位置,返回整型。

语法:

int strpos ( string string, mixed needle [, int start] )

参数说明如下: 参数     说明
string     要处理的字符串
needle     要定位的字符串
start     可选,定位的起始位置

例子:

<?php
echo strpos('abcdef', 'c');    //输出 2
?>

strrpos() 函数用于定位字符串最后一次出现的位置,返回整型。

语法:

int strpos ( string string, mixed needle [, int start] )

strrpos() 函数用法与 strpos() 类似,只不过 strrpos() 用于取得指定字串最后出现的位置。

例子:

<?php
$str = "This function returns the last occurance of a string";
$pos = strrpos($str, "st");
if($pos !== FALSE){
    echo '字串 st 最后出现的位置是:',$pos;
} else {
    echo '查找的字符串中没有 in 字串';
}
?>

运行该例子,浏览器输出:

字串 st 最后出现的位置是:46




3.php处理字符串格式的计算公式

有时候我们对每一种产品都有一个提成公式,而这个计算提成的公式是以字符串格式存在表中的
当我们用这个计算公式时,他并不像我们写的:$a=2+3*5;这样简单的能计算出结果,而它是个字符串
所以,我们就必须把字符串转化为我们能够处理的结果
而php中的eval()函数可以处理php代码,因此可以用此来解决:以字符串格式存储的计算公式


     $a=3;  $b=12;
     $str='2*($a+$b)';
    $result=eval("return $str;");

     echo $result;

    会输出:30

     //是表达式的值  其中eval()中的return $str;就是php代码


4.substr(),mb_substr()及mb_strcut函数用法与区别


在php中substr(),mb_substr()及mb_strcut三个函数都是字符截取函数,但是substr截取中文时会有乱码,而后两者支持中文截取,下面我来介绍介绍。

<?php
$siteurl = 'www.111cn.net';
print_r (substr($siteurl,-6,2));exit;

如果要截取双字节的汉字.则要用PHP mb_substr函数或mb_strcut函数,但这两个函数依赖php扩展php_mbstring.dll组件,所以要配置你的服务器.
即把php安装目录中的php_mbstring.dll文件复制到你的windows 2003 的c盘的Windows/system32目录中.


举个例子:
代码如下     
<?php
echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>
输出:这样一来我的字

代码如下     
<?php
echo mb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>
输出:这样一

小注:从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象……

substr只支持单字节的,这样只适合英文截取,而mb_substr函数是双字体截取了,正好可用于中文了,而mb_strcut是三字节了。

substr()函数用来截取字符串,但是对于中文字符会出现问题,而mb_substr()和mb_strcut这两个函数可以,
用法与substr()相似,只是在函数最后要加入多一个参数,以设定字符串的编码,使用这两个函数需要在php.ini中把php_mbstring.dll打开。



5.substr_count()函数检索字符出现的次数


php如何计算某一字符在字符串中出现的次数?使用substr_count()函数检索字符出现的次数,获取指定字符在字符串中出现的次数。


语法:substr_count(haystack,needle)

参数     描述
string     必需。规定要检查的字符串。
replacement     必需。规定要插入的字符串。
start     可选。规定在字符串中何处开始搜索。
charlist     可选。规定搜索的长度。


使用substr_count()函数获取特定字符在字符串中出现的次数实例如下:
<?php教程
echo substr_count(“zero的php自学手册”,”的”);
echo “<br>”;
echo substr_count(“www.111cn.net”,”o”);
echo “<br>”;
echo substr_count(“1033114118′,”1′);
?>
实例结果:
1
2
5



6.计算两个字符串的相似度


similar_text — 计算两个字符串的相似度

int similar_text ( string $first , string $second [, float &$percent ] )
$first 必需。规定要比较的第一个字符串。
$second 必需。规定要比较的第二个字符串。
$percent 可选。规定供存储百分比相似度的变量名。

两个字符串的相似程度计算依据 Oliver [1993] 的描述进行。注意该实现没有使用 Oliver 虚拟码中的堆栈,但是却进行了递归调用,这个做法可能会导致整个过程变慢或变快。也请注意,该算法的复杂度是 O(N**3),N 是最长字符串的长度。


比如我们想找字符串abcdefg和字符串aeg的相似度:


代码如下:
$first = "abcdefg";
$second = "aeg";
echo similar_text($first, $second);

//结果输出3.如果想以百分比显示,则可使用它的第三个参数,如下:
$first = "abcdefg";
$second = "aeg";
similar_text($first, $second, $percent);
echo $percent;


similar_text函数的使用及实现过程。similar_text() 函数主要是用来计算两个字符串的匹配字符的数目,也可以计算两个字符串的相似度(以百分比计)。与 similar_text() 函数相比,我们今天要介绍的 levenshtein() 函数更快。不过,similar_text() 函数能通过更少的必需修改次数提供更精确的结果。在追求速度而少精确度,并且字符串长度有限时可以考虑使用 levenshtein() 函数。


7.php计算字符串的宽度


mb_strwidth($str, $encoding) 返回字符串的宽度

$str 要计算的字符串

$encoding 要使用的编码,如 utf8、gbk

mb_strimwidth($str, $start, $width, $tail, $encoding) 按宽度截取字符串

$str 要截取的字符串

$start 从哪个位置开始截取,默认是0

$width 要截取的宽度

$tail 追加到截取字符串后边的字符串,常用的是 ...

$encoding 要使用的编码


<?php
/**
 * utf8 编码格式
 * 1个中文占用3个字节
 * 我们希望的是1个中文占用2个字节,
 * 因为从宽度上看2个英文字母占用的位置相当于1个中文
 */

// 测试字符串
$str = 'aaaa啊啊aaaa啊啊啊aaa';
echo strlen($str); // 只用strlen输出为25个字节

// 必须指定编码,不然会使用php的内码 mb_internal_encoding()可以查看内码
// 使用mb_strwidth输出字符串的宽度为20使用utf8编码
echo mb_strwidth($str, 'utf8');

// 只有宽度大于10才截取
if(mb_strwidth($str, 'utf8')>10){
    // 此处设定从0开始截取,取10个追加...,使用utf8编码
    // 注意追加的...也会被计算到长度之内
    $str = mb_strimwidth($str, 0, 10, '...', 'utf8');
}

// 最后输出 aaaa啊... 4个a算4个 1个啊算2个 3个点算3个 4+2+3=9
// 是不是很简单啊,有的人说了为什么是9个不是10个吗?
// 因为正好“啊”的后边还是“啊”,中文算2个,9+2=11 超出了设定,所以去掉1个就是9了
echo $str;

如果对于全中文没有问题但如果中间有符号了就有问题了,如我使用mb_strimwidth,mb_strwidth,后发现如果标题中存在“”符号的时候,PHP mb_strwidth会将该符号认为是1个宽度,我纳闷了这个不是中文的双引号嘛,照理说肯定是宽字节的,长度应该是2个宽度,后查询“”unicode分别为u201C和u201D,不在中文字符的范围中,再查询unicode.org 的码表,发现u2000-u206F是通用符号的范围,此范围中的字符虽然都是宽字符的形式,但是PHP 的mb_函数却认为是1个宽度



8.用php的strpos()函数判断字符串中是否包含某字符串的方法


PHP strpos() 函数
  strpos() 函数返回字符串在另一个字符串中第一次出现的位置。   如果没有找到该字符串,则返回 false。
语法
  strpos(string,find,start)   参数 描述
string 必需。规定被搜索的字符串。
find 必需。规定要查找的字符。
start 可选。规定开始搜索的位置。

  注释:该函数对大小写敏感。如需进行对大小写不敏感的搜索,请使用 stripos()函数。
编辑本段例子
  <?php
  echo strpos(www.idc-gz.com,"idc");
  ?>  
 输出:   4


判断某字符串中是否包含某字符串的方法
if(strpos('www.idc-gz.com','idc-gz') !== false){
 
  echo '包含';
 
}else{
 
  echo '不包含';
 }


很多人用下面的判断方法,是错误的:
if(strpos('www.idc-gz.com','idc-gz') ){
 

  echo '包含';
 

  }else{
 

  echo '不包含';
 

  }
上面也能得出正确的结果,但方法是错误的,如果if(strpos('idc-gz.com','idc-gz') ),那就得不到正确的结果,原因是位置是从0开始,第一个位置找到了,就是0,php中的0,也就不是true,上面的判断将不会成立,这点要十分注意!



9.php判断字符串是否以某字符结尾


PHP strrchr() 函数

PHP String 函数
实例

搜索 "Shanghai" 在字符串中的位置,并返回从该位置到字符串结尾的所有字符:

<?php
echo strrchr("I love Shanghai!","Shanghai");
?>

运行实例
定义和用法

strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。


注释:该函数是二进制安全的。
语法

strrchr(string,char)

参数     描述
string     必需。规定要搜索的字符串。
char     必需。规定要查找的字符。如果该参数是数字,则搜索匹配此数字的 ASCII 值的字符


实例:

if(strrchr('liyongjian555sohu.com','@sohu.com') != '@sohu.com'){

    echo '不包含';

}else{

    echo '包含';

}


PHP常用字符串函数总结



 字符串常用函数 函数名描述实例输入输出操作 trim()trim删除字符串两端的空格或其他预定义字符$str = "\r\nHello World!\r\n";
echo trim($str);目标字串清除后的字符串 rtrim()删除字符串右边的空格或其他预定义字符$str = "Hello World!\n\n";
echo rtrim($str); chop()rtrim()的别名 ltrim()删除字符串左边的空格或其他预定义字符$str = "\r\nHello World!";
echo ltrim($str); dirname()dirname返回路径中的目录部分echo dirname("c:/testweb/home.php");一个包含路径的字符串返回文件路径的目录部分//c:/testweb 字符串生成与转化: str_pad()sta_pad把字符串填充为指定的长度$str = "Hello World";
echo str_pad($str,20,".");要填充的字符串|新字符串的长度|供填充使用的字符串,默认是空白完成后的字符串 str_repeat()str_repeat重复使用指定字符串echo str_repeat(".",13);要重复的字符串|字符串将被重复的次数13个点 str_split()str_split把字符串分割到数组中print_r(str_split("Hello"));要分割的字符串|每个数组元素的长度,默认1拆分后的字符串数组Array ( [0] => H [1] => e [2] => l [3] => l [4] => o ) strrev()strrev反转字符串echo strrev("Hello World!");目标字符串颠倒顺序后的字符串!dlroW olleH wordwrap()workwrap按照指定长度对字符串进行折行处理$str = "An example on a long word is: Supercalifragulistic";
echo wordwrap($str,15);目标字符串|最大宽数折行后的新字符串 str_shuffle()str_shuffle随机地打乱字符串中所有字符echo str_shuffle("Hello World");目标字符串顺序打乱后的字符串 parse_str()parse_str将字符串解析成变量parse_str("id=23&name=John%20Adams",$myArray);
print_r($myArray);要解析的字符串|存储变量的数组名称返回Array(
[id] => 23
[name] => John Adams) number_format()number_format通过千位分组来格式化数字 要格式化的数字|规定多少个小数|规定用作小数点的字符串|规定用作千位分隔符的字符串1,000,000
1,000,000.00
1.000.000,00 大小写转换: strtolower()strtolower字符串转为小写echo strtolower("Hello WORLD!");目标字符串小写字符串 strtoupper()strtoupper字符串转为大写echo strtoupper("Hello WORLD!");大写字符串 ucfirst()ucfirst字符串首字母大写echo ucfirst("hello world");Hello world ucwords()ucwords字符串每个单词首字符转为大写echo ucwords("hello world");Hello World html标签关联: htmlentities()htmlentities把字符转为HTML实体$str = "John & 'Adams'";
echo htmlentities($str, ENT_COMPAT);John & 'Adams' htmlspecialchars()htmlspecialchars预定义字符转html编码 nl2br()nl2br\n转义为<br>标签echo nl2br("One line.\nAnother line.");处理后的字符串 strip_tags()strip_tags剥去 HTML、XML 以及 PHP 的标签echo strip_tags("Hello <b>world!</b>"); addcslashes()addcslashes在指定的字符前添加反斜线转义字符串中字符$str = "Hello, my name is John Adams.";
echo $str;
echo addcslashes($str,'m');目标字符串|指定的特定字符或字符范围Hello, my name is John Adams.Hello, \my na\me is John Ada\ms.stripcslashes()stripcslashes 删除由addcslashes()添加的反斜线echo stripcslashes("Hello, \my na\me is Kai Ji\m.");目标字符串Hello, my name is Kai Jim. addslashes()addslashes指定预定义字符前添加反斜线$str = "Who's John Adams?";echo addslashes($str);把目标串中的' " \和null进行转义处理 stripslashes()stripslashes删除由addslashes()添加的转义字符echo stripslashes("Who\'s John Adams?");清除转义符号Who's John Adams? quotemeta()quotemeta在字符串中某些预定义的字符前添加反斜线$str = "Hello world. (can you hear me?)";
echo quotemeta($str);Hello world\. \(can you hear me\?\). \ + * ? [] ^ $ () chr()chr从指定的 ASCII 值返回字符echo chr(052);ASCII 值返回对应的字符//* ord()ord返回字符串第一个字符的 ASCII 值echo ord("hello");字符串第一个字符的 ASCII 值 字符串比较: strcasecmp()strcasecmp不区分大小写比较两字符串echo strcasecmp("Hello world!","HELLO WORLD!");两个目标字符串大1|等0|小-1 strcmp()strcmp区分大小写比较两字符串 strncmp()strncmp比较字符串前n个字符,区分大小写int strncmp ( string $str1 , string $str2 , int $len ) strncasecmp()strncasecmp比较字符串前n个字符,不区分大小写int strncasecmp ( string $str1 , string $str2 , int $len ) strnatcmp()strnatcmp自然顺序法比较字符串长度,区分大小写int strnatcmp ( string $str1 , string $str2 )目标字符串 strnatcasecmp()strnatcasecmp自然顺序法比较字符串长度,不区分大小写int strnatcasecmp ( string $str1 , string $str2 ) 字符串切割与拼接: chunk_split()chunk_split将字符串分成小块str chunk_split(str $body[,int $len[,str $end]])$body目标字串,$len长度,$str插入结束符分割后的字符串 strtok()strtok切开字符串str strtok(str $str,str $token)目标字符串$str,以$token为标志切割返回切割后的字符串返回第一个切割符前的 explode()explode使用一个字符串为标志分割另一个字符串array explode(str $sep,str $str[,int $limit])$sep为分割符,$str目标字符串,$limit返回数组最多包含元素数字符串被分割后形成的数组 implode()implode同join,将数组值用预订字符连接成字符串string implode ( string $glue , array $pieces )$glue默认,用''则直接相连 substr()substr截取字符串string substr ( string $string , int $start [, int $length ] ) 字符串查找替换: str_replace()str_replace字符串替换操作,区分大小写mix str_replace(mix $search,,mix $replace,mix $subject[,int &$num])$search查找的字符串,$replace替换的字符串,$subject被查找字串,&$num返回替换后的结果 str_ireplace()str_ireplace字符串替换操作,不区分大小写mix str_ireplace ( mix $search , mix $replace , mix $subject [, int &$count ] )$search查找的字符串,$replace替换的字符串,$subject被查找字串,&$num返回替换后的结果 substr_count()substr_count统计一个字符串,在另一个字符串中出现次数int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] ) substr_replace()substr_replace替换字符串中某串为另一个字符串mixed substr_replace ( mixed $string , string $replacement , int $start [, int $length ] ) similar_text()similar_text返回两字符串相同字符的数量int similar_text(str $str1,str $str2)两个比较的字符串整形,相同字符数量 strrchr()strrchr返回一个字符串在另一个字符串中最后一次出现位置开始到末尾的字符串string strrchr ( string $haystack , mixed $needle ) strstr()strstr返回一个字符串在另一个字符串中开始位置到结束的字符串string strstr ( string $str, string $needle , bool $before_needle ) strchr()strchrstrstr()的别名,返回一个字符串在另一个字符串中首次出现的位置开始到末尾的字符串string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] ) stristr()stristr返回一个字符串在另一个字符串中开始位置到结束的字符串,不区分大小写string stristr ( string $haystack , mixed $needle [, bool $before_needle = false ] ) strtr()strtr转换字符串中的某些字符 string strtr ( string $str , string $from , string $to ) strpos()strpos寻找字符串中某字符最先出现的位置int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) stripos()stripos寻找字符串中某字符最先出现的位置,不区分大小写int stripos ( string $haystack , string $needle [, int $offset ] ) strrpos()strrpos寻找某字符串中某字符最后出现的位置int strrpos ( string $haystack , string $needle [, int $offset = 0 ] ) strripos()strripos寻找某字符串中某字符最后出现的位置,不区分大小写int strripos ( string $haystack , string $needle [, int $offset ] ) strspn()strspn返回字符串中首次符合mask的子字符串长度int strspn ( string $str1 , string $str2 [, int $start [, int $length ]] ) strcspn()strcspn返回字符串中不符合mask的字符串的长度int strcspn ( string $str1 , string $str2 [, int $start [, int $length ]] )$str1被查询,$str2查询字符串,$start开始查询的字符,$length查询长度返回从开始到第几个字符 字符串统计: str_word_count()str_word_count统计字符串含有的单词数mix str_word_count(str $str,[])目标字符串统计处的数量 strlen()strlen统计字符串长度int strlen(str $str)目标字符串整型长度 count_chars()count_chars统计字符串中所有字母出现次数(0..255)mixed count_chars ( string $string [, int $mode ] ) 字符串编码: md5()md5字符串md5编码$str = "Hello";
echo md5($str); 






0 0
原创粉丝点击