学习PHP中的字符串操作函数(三)

继续我们的 PHP 中字符串函数的学习之旅。今天我们要学习的内容是除了 str_ 和 str 开头之外的其它函数,这些函数也有很多非常好玩的内容,让我们赶快进入主题吧。

分隔、打断字符串

关于这个分割字符串并成为数组,或者是反过来的将数组组合成字符串的功能来说,implode() 和 explode() 这两个函数真的是出镜率非常的高。所以它们的使用也不用我多做介绍了,直接上手就行。

$arrs = explode(',', 'a,b,c,d');
print_r($arrs);
// Array
// (
//     [0] => a
//     [1] => b
//     [2] => c
//     [3] => d
// )

echo implode('-', $arrs), PHP_EOL; // a-b-c-d
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

explode() 函数还有第三个参数,是指定一共返回多少个数组元素的功能。比如我们指定返回两个元素的话,那么就会分割成下面这样的数组。

print_r(explode(',', 'a,b,c,d', 2));
// Array
// (
//     [0] => a
//     [1] => b,c,d
// )
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

另外还有一个函数,其实也就是 implode() 函数的别名,叫做 join() 函数。相信看到这个函数接触过其它语言的同学就感到非常亲切了,这才是这个字符串拼接功能的正确叫法嘛。这两个函数是一模一样的,join() 就是一个别名,不管我们使用哪个都可以。

除了分割字符串和拼接数组之外,我们还有一个函数可以按指定的字符数量来为字符串添加分割内容。

$text = "The quick brown fox jumped over the lazy dog.";
echo wordwrap($text, 20, "<br />\n"), PHP_EOL;
// The quick brown fox<br />
// jumped over the lazy<br />
// dog.
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

看出来没有,它是在我们指定的 20 个字符长度之后就把后面我们要添加的换行内容添加进了字符串中。其实它和我们上篇文章讲过的 chunk_split() 这个函数有点像,功能非常类似,而且也是返回的是一个字符串。

首字母大小写转换

这个和我们第一篇文章学习到的 strtoupper() 以及 strtolower() 是不同的功能了。它们两个都是对整个字符串中的全部字符起效果的,而我们今天学的内容只是对首字母起效果。

echo lcfirst('Open the door'), PHP_EOL; // open the door
echo ucfirst('open the door'), PHP_EOL; // Open the door
echo ucwords('open the door'), PHP_EOL; // Open The Door
  • 1.
  • 2.
  • 3.

lcfirst() 把第一个单词的首字母变成小写,ucfirst() 就是反过来将第一个单词的首字母变成大写。ucwords() 则是将每个单词的首字母都变成大写的。

字符串比较

首先是计算两个字符串之间的编辑距离。

echo levenshtein('carrot', 'carrrot'), PHP_EOL; // 1
echo levenshtein('carrot', 'banana'), PHP_EOL; // 5
echo levenshtein('carrot', 'orange'), PHP_EOL; // 6
  • 1.
  • 2.
  • 3.

编辑距离,是指两个字串之间,通过替换、插入、删除等操作将字符串 str1 转换成 str2 所需要操作的最少字符数量。其实我们就可以看做是两个字符串中不同字符的数量,当然,它们的位置也是一一对应的,比如说第二条中的 banana 中第二个 a 和 carrot 中的 a 对应上了,所以这个返回的是 5 。而最后一个测试代码中 orange 虽然也有 a ,但和 carrot 中的位置不对应,所以返回的就是 6 ,也就是所有字符都要替换。

接下来就是我原来接触并且在项目中使用过的一个函数。

echo similar_text('carrot', 'carrrot', $per), PHP_EOL; // 6
echo $per, PHP_EOL; // 92.307692307692
echo similar_text('carrot', 'banana', $per), PHP_EOL; // 1
echo $per, PHP_EOL; // 16.666666666667
echo similar_text('carrot', 'potato', $per), PHP_EOL; // 2
echo $per, PHP_EOL; // 33.333333333333
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

similar_text() 函数返回的是两个字符串的相似程度。如果给定最后一个参数为一个引用变量的话,那么将会将两个字符串中的相似比率放到这个变量中,在后面打印这个变量就可以看到这两个字符串的相似比率。

我之前做过的项目中,有伪原创的判断识别功能,就是利用的这一个函数。作者在针对某篇文章进行伪原创的时候,会将他新写的内容与文章原文进行对比,在提交文章保存的时候就会比较相似度,使用的就是这个函数。

字符串两边去除特殊字符

其实这个功能相关的函数也不用我多介绍了,毕竟也是很常用的函数之一。

echo trim("  \r\n\tTest\t"), PHP_EOL; // Test

echo trim("a-Test--a", 'a'), PHP_EOL; // -Test--

echo ltrim("  \r\n\tTest\t"), PHP_EOL;
// Test 

echo rtrim("  \r\n\tTest\t"), PHP_EOL;
//  
// Test
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

需要注意的,原来我也一直以为这个 trim() 默认情况下只是去除空格,其实,如果不给第二个参数的话,它会去除 空格、\n、\t、\r、\0、\x0B 这些内容。如果我们指定了第二个参数的话,那么就是按第二个参数指定的内容来删除。

trim() 是删除整个字符串两边的内容。ltrim() 和 rtrim() 从名字就可以看出来,分别就是删除字符串左边和右边的内容。

格式化字符串

这里的格式化主要指的是将字符串格式化成标准的数字或者是货币相关的内容。

echo number_format('12345.678'), PHP_EOL; // 12,346
echo number_format('12345.678', 1), PHP_EOL; // 12,345.7
echo number_format('12345.678', 2, ',', ' '), PHP_EOL; // 12 345,68
  • 1.
  • 2.
  • 3.

数字格式化一般用得最多的是在保留小数点的情况下的使用。不过除了小数点的保留功能之后,我们使用这个 number_format() 函数还可以指定数字的 千分位分隔符 和 小数分隔符 。

setlocale(LC_MONETARY, 'en_US');
echo money_format('%i', 12345.678), PHP_EOL; // USD12,345.68

setlocale(LC_MONETARY, 'zh_CN');
echo money_format('%i', 12345.678), PHP_EOL; // CNY12,345.68

setlocale(LC_MONETARY, 'de_DE');
echo money_format('%i', 12345.678), PHP_EOL; // EUR12.345,68
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

对于货币的格式化来说,最重要的是就是要和当前的国家信息编码相关关联。关于这一块的内容我们在之前讲国际化相关的文章中也有过深入的学习,大家可以翻翻之前的文章。

解析查询字符串

最后就是解析查询字符串的函数。这个查询字符串其实就是我们使用 GET 方式传递数据的时候跟在 url 中问号后面的内容。

$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first, PHP_EOL; // value
echo $arr[0], PHP_EOL; // foo bar
echo $arr[1], PHP_EOL; // baz
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

在默认情况下,这个 parse_str() 函数会将这个查询字符串中的内容直接解析到全局变量中,也就是将每个参数变成一个变量解析出来。这种能力其实并不是一个好的能力,毕竟解析出来的东西不是我们可控的,而用户如果传递了一些不安全的参数,正好又是我们后面要用到的变量的话,这就非常危险了。所以说,更好的办法是使用它的第二个参数,给它一个引用变量,这样解析出来的内容就会全都放在这个引用变量中并保存成一个数组了。

parse_str($str, $output);
print_r($output);
// Array
// (
//     [first] => value
//     [arr] => Array
//         (
//             [0] => foo bar
//             [1] => baz
//         )

// )
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

总结

关于字符串相关的函数我们就介绍到这里,当然,还有很多内容是我们没有讲到的,不过那些函数也是相对来说非常少用到的内容了。大家可以自己多去官方文档上查阅学习,接下来,我们要学习到的又是另一块 PHP 中非常重要的大功能函数的使用,那就是数组相关函数的学习。这个也是重中之重的内容,千万不要错过了哦。

测试代码:

 https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/03/source/9.%E5%AD%A6%E4%B9%A0PHP%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0%EF%BC%88%E4%B8%89%EF%BC%89.php

参考文档:

 https://www.php.net/manual/zh/ref.strings.php