Practical PHP Programming

子字符串

string substr ( string source, int start [, int length])

substr()函数允许你读取字符串的一部分,它最少需要两个参数:要处理的字符串和要读取的起始位置。这个函数的第三个参数是可选的,用来说明你想要读取的字符串的长度。下面是这个函数基本用法的示例:

<?php
    $string = "Goodbye, Perl!";
    $a = substr($string, 1);
    $b = substr($string, 0);
    $c = substr($string, 5);
    $d = substr($string, 50);
    $e = substr($string, 5, 4);
    $f = substr($string, 10, 1);
?>

上面的代码执行之后,$a的值是“oodbye, Perl!”,而不是整个$string,因为PHP字符串的位置是从0开始计数的,而我们将1作为第二个参数传入,substr()就将从第二个字符开始,一直到最后的字符串赋值给$a了。 我们从$string0的位置开始复制,所以$b就得到了整个$string$c我们是从5的位置(第6个字符)开始复制,所以$c的值是“ye, Perl!”。 $d我们从50的位置(第51个字符)开始,很明显结果为空。这一行是为了说明即使子字符串为空,PHP也不会返回错误——它仅仅返回一个空字符串。 从$e开始,我们开始使用第三个参数。5作为substr()的第二个参数,4作为第三个参数,意思是从位置为5(第六个字符)开始复制4个字符,结果是“ye, ”,注意第四个字符是空格。 最后是变量$f,它的值是位置为10的一个字符,也就是“e”。

目前为止,应该很容易理解,但是substr()的功能不仅如此。你可以传入一个负数作为第三个参数,PHP将把它作为从结尾位置开始向前忽略的字符数,而不是要复制的字符的长度,来进行复制。例如:

<?php
    $string = "Goodbye, Perl!";
    $a = substr($string, 5, 5);
    $b = substr($string, 5, -1);
    $c = substr($string, 0, -7);
?>

$a直接是从位置为5的位置向后复制5个字符,也就是ye, P$b$c都用了负数的长度,也就是从字符串倒着向前数对应个数个字符作为结尾。因此$b为“ye, Perl”,$c为“Goodbye”。使用负数的长度相当于说“除了倒数三个,其余的全都复制”这种形式。

等等,还没结束,你也可以用一个负数作为起始位置,也就是从结尾向前数对应个字符作为开始。你也可以从负数开始复制负数长度的字符,希望下面几个例子能说明白:

<?php
    $string = "Goodbye, Perl!";
    $a = substr($string, 5);
    $b = substr($string, 5, 5);
    $c = substr($string, 0, -1);
    $d = substr($string, -5);
    $e = substr($string, -5, 4);
    $f = substr($string, -5, -4);
?>

上面这段代码说明了substr()的各种使用方式。你已经知道$a$b$c的用法了,分别是:从5的位置复制到结尾;从5的位置开始复制5个字符;除了最后一个字符外,其余全都复制。 $d的第二个参数是负数-5,运行代码后,$d将被设置为“Perl!”,因为是从字符串结尾向前数5个位置作为开始,一直复制到字符串结束。 $e的开始位置为-5,长度为正数4,运行后,PHP将从倒数第5个字符“P”开始复制4个字符,也就是说$e的值为“Perl”。 最后是$f,起始位置和长度都为负数,意思是“从倒数第5个字符开始,复制到倒数第四个字符前(忽略掉从后面开始的四个字符)为止”。实际我们只复制了一个字符“P”,运行代码看看$f到底包含了哪几个字符。神奇吧。