葡京网投哪个正规 > 新葡亰-编程 > php字符串与字符串操作教程详解,深入PHP中慎用双等于的详解_php技巧_脚本之家

原标题:php字符串与字符串操作教程详解,深入PHP中慎用双等于的详解_php技巧_脚本之家

浏览次数:65 时间:2019-11-24

PHP比较运算符出现的频率实在是太高了,尤其是 ==if{// do something}但是,你真的掌握了 == 了吗?细节很重要!来看下面的代码,说出你认为正确的答案var_dump;var_dump;var_dump;var_dump;var_dump;var_dump;先想出你的答案,然后再运行一次看看。如果答案没有差错,那么恭喜你,基础知识很扎实。

1、问题一关于弱类型

输出字符串

解释:如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。此规则也适用于 switch 语句。特别注意,字符串转换为整数时,是从左到右,直到遇到非数字字符为止。也就是说 '123abc456' 会被转换成 123,而不是 123456。另外字符串开始的空格会被忽略,比如 ' 234abc' 转换为 234。下面附上松散比较和严格比较的对照表

$str1 = 'yabadabadoo';

在PHP中,有四种方法输出字符串。echo结构可以一次输出多个值;print()只可以输出一个值;printf()可以格式化输出;print_r()可以输出数组,对调试很有好处。下面一一进行介绍。

$str2 = 'yaba';

  1. echo
    echo 是PHP的一个关键字,它没有返回值。在写法上,它可以省略小括号。如下代码:

if (strpos($str1,$str2)) {

 代码如下

echo "\"" . $str1 . "\" contains \"" . $str2 . "\"";

echo 'Test String';
echo('Test String');

} else {

  1. print
    print 也是PHP的一个关键字,它有返回值,一般返回true,返回false的情况应该没有。在写法上,它和echo一样,可以省略小括号。如下代码:

echo "\"" . $str1 . "\" does not contain \"" . $str2 . "\"";

 代码如下

}

 print 'Test String';
print('Test String');

正确运行的输出结果:

  1. printf
    printf可以像C语言的printf一样,格式化输出一个字符串。它的格式和C语言差不多,都是以%开头。其说明符定义如下。

"yabadabadoo" does not contain "yaba"

 
 b   参数为整数,显示其二进制
c   参数为整数,显示对应ASCII字符
d   参数为整数,显示其十进制
f   参数为双精度,显示为浮点数
e   参数为双精度,显示为科学计数型
g   参数为双精度,显示为浮点数或科学计数型
o   参数为整数,显示其八进制
s   参数为字符串,显示为字符串
u   参数为无符号整数,显示其十进制
x/X 参数为整数,显示其十六进制(分别为大小写显示)
%   输出%
要说明的是:
f,e默认小数点后六位,g在超过六位(加小数点)时,会四舍五入,如果四舍五入之后的值小于1000000会直接输出,大于的1000000的话会显示成科学计数型。f在值大于1.2e23输出的结果是不对的。
以上除%以外,其它的都可以指定输出总位数(小数点、E都算一位),并可以指定0或空格为补位符,还可以指定补位在左还是在右。
f,e可以指定小数点后位数。
如 %5d 表示输出总位数为5,不足左补空格; %05d 表示输出总位数为5,不足左补0; %05.1f 表示输出总位数为5,不足左补0,小数点后1位; %-05.1f 表示输出总位数为5,不足右补0,小数点后1位;
示例代码:

strpos是返回字符串str2在str1的位置,没有找到则返回false然而实际上这次返回了0而在if语句中0也被当作false,所以,我们需要对false做类型判断,正确的代码如下:

 代码如下

$str1 = 'yabadabadoo';

printf("%7.2f", 1.2);       // " 1.20"
printf("%-07.2f", 1.2);     // "1.20000"

$str2 = 'yaba';

  1. sprintf
    sprintf和格式转换和printf一样,两者区别在于printf直接输出,而sprintf返回一个格式化后的字符串。

  2. print_r和var_dump
    print_r和var_dump都能输出数组和对象,但print_r对布尔型的输出不太明显;var_dump输出比较详细,一般调试时用得多。
    如下代码:

if (strpos($str1,$str2) !== false) {

 代码如下

echo "\"" . $str1 . "\" contains \"" . $str2 . "\"";

$v = new test();
print_r($v);
var_dump($v);
class test {
    public $num = 1;
    public $str = "222";
    public $bln = true;
    function test() {
        global $num;
    }
}

} else {

结果为:

echo "\"" . $str1 . "\" does not contain \"" . $str2 . "\"";

 代码如下

}

test Object
(
    [num] => 1
    [str] => 222
    [bool] => 1
)
object(test)#1 (3) {
  ["num"]=>
  int(1)
  ["str"]=>
  string(3) "222"
  ["bool"]=>
  bool(true)
}

需要注意的是我们使用了!==,在php 和 JS中= !相对== 更为严格需要要求数据类型的一致。

字符串比较和查找

2、下面的输出结果会是怎样?

  1. 字符串比较

$x = 5;

在PHP中,可以用==(双等号)或者 ===(三等号)来比较字符串。两者的区别是双等号不比较类型,三等号会比较类型,它不转换类型;用双等号进行比较时,如果等号左右两边有数字类型的值,刚会把另一个值转化为数字,然后进行比较。这样的话,如果是纯字符串或者NULL时,会转化为0进行比较。同样,大小于号也和等号一样,比较时可能出现不正确的结果。
所以,比较字符串可以用PHP的自带函数strcmp和strcasecmp。其中strcasecmp是strcmp的变种,它会先把字符串转化为小写再进行比较。 如下代码:

echo $x;

 代码如下

echo "";

var_dump(0 == 'Test');
var_dump(0 == '');
var_dump(5 > 'T');
var_dump(strcmp(5, 'T'));

echo $x+++$x++;

结果为(第1~3结果是不对的,只有第4个是对的):

echo "";

bool(true)
bool(true)
bool(true)
int(-1)

echo $x;

  1. 字符串处理
    1. 子串

echo "";

 

echo $x---$x--;

 代码如下

echo "";

 $sub = substr(string, start[, length]);

echo $x;

2. 子串替换

实际运行结果是

$newstring = substr_replace(string, new, start[, length]);
用这个函数可以实现字符串的插入,删除操作。这个函数的start和length可以为负数。分别表示从后开始计算以及保留最后几位不替换。
3. 字符串反序

5

 代码如下

11

$newstring = strrev(string);

7

4. 重复字符串

1

 代码如下

5

$newstring = str_repeat(string, count);

$x++ 和 $x--这个问题其实非常容易遇见,我们只需记住$x++使用最近的值,然后才自增。

返回一个重复count次string的新字符串。
5. 填充字符串

运算符的优先级,++ 是明显高于 +,因此先执行++ 再执行 + 。关于运算符的优先级,有的时候我们真的可以通过括号来让我们的程序更加让人直观的了解,毕竟代码它不光是用于执行的,有的时候或许团队的可读性也是提高效率的一种。

$newstring = str_pad(to_pad, length[, with[, type]]);

3、关于变量的引用;

其中type有:STR_PAD_RIGHT(默认)、STR_PAD_LEFT和STR_PAD_BOTH三种;with默认为空格。函数表示把to_pad字符串用with填充为一个长度为length的字符串。 如下代码:

$a = '1';

 代码如下

$b = &$a;

// 子串
var_dump(substr('1234567890', 8));       // 90
var_dump(substr('1234567890', 0, 2));    // 12
// 反方向子串
var_dump(substr('1234567890', -8));      // 34567890
var_dump(substr('1234567890', -8, -2));  // 345678
var_dump(substr('1234567890', -8, 2));   // 34

$b = "2$b";

// 插入
var_dump(substr_replace('1234567890', 'a', 0, 0));   // a1234567890
// 删除
var_dump(substr_replace('1234567890', '', 8));       // 12345678
// 反方向删除
var_dump(substr_replace('1234567890', '', -2, -1));  // 123456780
// 替换
var_dump(substr_replace('1234567890', 'a', 0, 1));   // a234567890
// 反方向替换
var_dump(substr_replace('1234567890', 'a', -2, -1)); // 12345678a0

问 $a 和 $b的值各位多少

// 字符串反转
var_dump(strrev('1234567890'));     // 0987654321

部分第一时间会想到 $a='1' $b='21',仔细一看 $b=&$a,这里$b是变量$a的引用而不是直接 赋值。

// 重复字符串
var_dump(str_repeat('12', 3));      // 121212

4、下面是true还是false

// 填充字符串
var_dump(str_pad('a', 10, '12'));               // a121212121
var_dump(str_pad('a', 10, '12', STR_PAD_LEFT)); // 121212121a
var_dump(str_pad('a', 10, '12', STR_PAD_BOTH)); // 1212a12121

var_dump(0123 == 123);

3. 分解字符串 在PHP中,字符串的分解用explode,合并用implode(join是implode的别名),标记用strtok。还有另一个函数slipt也可以分解(正则分解),但5.3以后版本已经不推介了。 另外PHP中还有一个sscanf()函数,用于读取字符串。
strtok标记时,用strtok($str, $token)来初始化,用strtok($token)来继续取值。
代码如下:

var_dump('0123' == 123);

 代码如下

var_dump('0123' === 123);

$str = '1,2,3';
$arr1 = explode(',', $str);     // array('1', '2', '3')
$arr2 = explode(',', $str, 2);  // array('1', '2,3')

var_dump(0123 == 123);// false,PHP会默认把0123当作8进制来处理,实际转化为10进制就是83,显然这不是相等的。

$str1 = implode(',', $arr1);    // '1,2,3'

var_dump('0123' == 123);// true这里php会非常有趣的将'0123'转换成一个数字而且默认去掉了前面的0也就是123==123

$str2 = strtok($str, ',');      // 1
$str3 = strtok(',');            // 2
$str4 = strtok(',');            // 3

var_dump('0123' === 123);// false很显然上面的问题已经说过了数字和字符串类型不一致。

// array(86, 10, 88888888, 'Beijin')
$arr3 = sscanf('+86(10)88888888 Beijin', '+%d(%d)%d %s');

5、下面的代码有什么问题吗?输出会是什么,怎样修复它

4.字符串查找
在PHP中,字符串的查找有三个系列。返回位置的、返回字符串的、掩码个数匹配。其中,返回位置的的函数一共有两个,strpos()和strrpos();返回字符串的也有两个strstr()和strchr();返回掩码匹配数的函数有strspn()和strcspn()。
strpos表示从左边开始计数,返回要查找的字符串第一次出现的位置;strrpos表示从右边计数,返回要查找的字符串第一次出现的位置。
strstr表示从左边计数,返回要查找字符串第一次到结尾的子串(包括查找字符串),当查找的是字符时,可以用ascii码数字来表示字符;stristr表示不区分大小查找;strchr是strstr的别名;strrchr返回字符最后出现到结尾的子串。
strspn表示从左边计数,第一次出现非掩码之前的子串的字符数;strcspn表示从左边计数,第一次出现掩码之前的子串的字符数。
示例代码:

$referenceTable = array();

 代码如下

$referenceTable['val1'] = array;

$pos = strpos('This a hello world program', ' ');        // 4
$pos = strpos('This a hello world program', 32);         // 4

$referenceTable['val2'] = 3;

葡京网投哪个正规,$pos = strrpos('This a hello world program', ' ');       // 18
$pos = strrpos('This a hello world program', 32);        // 18

$referenceTable['val3'] = array;

$str = strstr('This a hello world program', ' ');        // " a hello world program"
$str = strstr('This a hello world program', 32);         // " a hello world program"

$testArray = array();

$str = stristr('This a hello world program', ' A');      // "a hello world program"
$str = stristr('This a hello world program', 65);        // "a hello world program"

$testArray = array_merge($testArray, $referenceTable['val1']);

$str = strrchr('This a hello world program', ' ');       // " program"
$str = strrchr('This a hello world program', 32);        // " program"

var_dump($testArray);

$str1 = "12345 12345 12345";
$len = strspn($str1, '12345');                           // 5
$len = strcspn($str1, ' ');                              // 5

$testArray = array_merge($testArray, $referenceTable['val2']);

常用的字符串操作

var_dump($testArray);

  1. 访问单个字符
    在PHP中,可以把字符串当成一个字符的数组,可以直接用数组的访问方法来访问字符串。如$str[0]。
    在这里要注意的是,如果字符是ASCII码以外时,访问会有问题。因为这种访问只能取得一个字节。

  2. 删除空白字符
    在PHP中,可以用trim(), ltrim(), rtrim()三个函数来删除字符串开头或结尾的空白字符。
    其中,trim()用于删除字符前后的空白字符;ltrim()用于删除字符左侧的空白字符;rtrim()用于删除字符右侧的空白字符。
    在默认情况下,会删除以下字符:空格( |Ox20)、制表符TAB(n|Ox09)、换行(n|OxOA)、回车(r|0x0D)、空字符(|Ox00)。
    也可以自己在参数里指定。

  3. 改变大小写
    strtolower() 把整个字符串转化为小写。
    strtoupper() 把整个字符串转化为大写。
    ucfirst() 把字符串的第一个字符转化为大写,其它字符不变。
    ucwords() 把字符串里的每一个单词的第一个字符转为大写,其它字符不变。

  4. HTML转义
    HTML转义是指把字符串转化成HTML显示用的字符串。对此,PHP中有两个函数实现此功能。
    htmlentities() 把除空格外的所有可以转换的字符都转成HTML形式。
    htmlspecialchars() 把必要的(与符号&、双引号、单引号、大于号、小于号)转化为HTML形式。

  5. URL转义
    URL转义是指把字符串转化成URL字符串。对此,PHP中有两个函数实现此功能。
    urlencode()和urldecode()是把空格转成+号,其它的转成URL字符串,前者转换,后者反转换
    rawurlencode()和rawurldecode()是把空格转成%20号,即普通URL字符串,其它的转成URL字符串,前者转换,后者反转换

  6. SQL转义
    跟PHP最相关的两个数据库(MySQL和PostgreSQL)都是以反斜杠为转义符的(Oracle是自己定义,其它数据库没有测试),对此PHP中用addslashes()函数来添加这些反斜杠,用stripcslashes()函数来删除这些反斜杠

$testArray = array_merge($testArray, $referenceTable['val3']);

var_dump($testArray);

实际输出如下:

array { [0]=> int [1]=> int }

NULL

NULL

运行的时候你或许还能看到下面的警告

Warning: array_merge(): Argument #2 is not an array

Warning: array_merge(): Argument #1 is not an array

array_merge需要传入的参数都是数组,如果不是,则会返回null。 你可以这样修改

$testArray = array_merge($testArray, $referenceTable['val1']);

var_dump($testArray);

$testArray = array_葡京正网网投,merge($testArray, $referenceTable['val2']);

var_dump($testArray);

$testArray = array_merge($testArray, $referenceTable['val3']);

var_dump($testArray);

6、$x应该是输出什么?

$x = true and false;

var_dump;

部分同学或许会第一时间想到false,实际上这里依旧是强调运算符的优先级,= 会比 and级别高点,因此等同下面的代码

$x = true;

true and false

答案显而易见。

7、经过下面的运算 $x的值应该是多少?

$x = 3 + "15%" + "$25"

答案是18,PHP是会根据上下文实现类型的自动转换

上面的代码我们可以这样理解,如果我们在与字符串进行数学运算,实际php会尽可能将字符串中的数组进行转换,如果是数字开头的话则转换成改数字比如"15%"会变成15,如果不是数字开头则会变成0; 上面的运算类似下面 :

$x = 3 + 15 + 0

8、运行下面的代码,$text 的值是多少?strlen又会返回什么结果?

$text = 'John ';

$text[10] = 'Doe';

上面代码执行完毕后 $text = "John D"(John后面会有连续的5个空格) strlen会返回11

$text[10] = "Doe"给某个字符串具体的某个位置具体字符时候,实际只会把D赋给$text. 虽然$text才开始只有5个自负长度,但是php会默认填充空格。这和别的语言有些差别。

9、下面的输出结果会是什么

$v = 1;

$m = 2;

$l = 3;

if( $l > $m > $v){

echo "yes";

}else{

echo "no";

}

实际的输出是"no",只要仔细分析就不难得出

$l>$m 会转换成1 ,则这个时候再和$m比较。

10、执行下面代码$x会变成什么值呢?

$x = NULL;

if ('0xFF' == 255) {

$x = '0xFF';

}

实际的运行结果是$x=0而不是255.

首先'oxFF' == 255我们好判断,会进行转换将16进制数字转换成10进制数字,0xff -> 255.

PHP使用is_numeric_string 判断字符串是否包含十六进制数字然后进行转换。

但是$x = '0xFF';是否也会变成255呢?显然不是,将一个字符串进行强制类型转换实际上用的是convert_to_long,它实际上是将字符串从左向右进行转换,遇到非数字字符则停止。因此0xFF到x就停止了。所以$x=0

葡京网投哪个正规 1葡京网投哪个正规 2

本文由葡京网投哪个正规发布于新葡亰-编程,转载请注明出处:php字符串与字符串操作教程详解,深入PHP中慎用双等于的详解_php技巧_脚本之家

关键词:

上一篇:Code生成二维码【葡京网投哪个正规】,php生成二维码程序代码

下一篇:启用disable_functions提高安全,disabled函数禁用的解决方法_php技巧_脚本之家