PHP字符串
字符串是PHP中最常用的数据类型之一,用于存储和操作文本。本教程将详细介绍PHP字符串的定义方法、基本操作、格式化技巧以及常用的字符串函数。
什么是字符串
字符串是由一系列字符组成的数据。在PHP中,字符是指单个字节,因此PHP中的字符串是字节序列,而不是字符序列。这意味着PHP本身不支持Unicode字符串,而是通过不同的编码方案(如UTF-8)在字符串中表示Unicode字符。
定义字符串的方法
1. 单引号字符串
最简单的定义字符串的方法是使用单引号('):
<?php
$str = 'Hello, World!';
echo $str; // 输出: Hello, World!
// 单引号内的变量不会被解析
$name = 'John';
echo 'My name is $name'; // 输出: My name is $name
// 单引号内的特殊字符需要转义
$quote = 'He said \'Hello\'';
echo $quote; // 输出: He said 'Hello'
// 单引号内只有反斜杠和单引号需要转义
$path = 'C:\\xampp\\htdocs';
echo $path; // 输出: C:\xampp\htdocs
?>
2. 双引号字符串
双引号字符串允许在字符串内解析变量和转义序列:
<?php
$str = "Hello, World!";
echo $str; // 输出: Hello, World!
// 双引号内的变量会被解析
$name = "John";
echo "My name is $name";
// 输出: My name is John
// 可以使用花括号明确指定变量范围
$age = 30;
echo "I am {$age} years old";
// 输出: I am 30 years old
// 访问数组元素
$person = array("name" => "John", "age" => 30);
echo "His name is {$person['name']}";
// 输出: His name is John
// 双引号内可以使用更多的转义序列
$text = "Line 1\nLine 2\tTabbed text";
echo "<pre>".$text."</pre>";
/* 输出:
Line 1
Line 2 Tabbed text
*/
?>
3. Heredoc 语法
Heredoc 语法用于定义多行字符串,以 <<< 开始,后面跟一个标识符,然后是字符串内容,最后以相同的标识符结束:
<?php
$text = <<<EOT
这是一个使用Heredoc语法定义的
多行字符串。
变量 $name 会被解析。
特殊字符如换行符会被保留。
EOT;
echo "<pre>".$text."</pre>";
/* 输出:
这是一个使用Heredoc语法定义的
多行字符串。
变量 John 会被解析。
特殊字符如换行符会被保留。
*/
// Heredoc 中的变量和表达式(PHP 5.3.0+)
$price = 19.99;
$quantity = 3;
$total = <<<TOTAL
价格: $price
数量: $quantity
总价: {$price * $quantity}
TOTAL;
echo $total;
/* 输出:
价格: 19.99
数量: 3
总价: 59.97
*/
?>
4. Nowdoc 语法
Nowdoc 语法类似于单引号字符串,但适用于多行。它以 <<<' 开始,后面跟一个标识符(必须用单引号括起来),然后是字符串内容,最后以相同的标识符结束:
<?php
$text = <<<'EOT'
这是一个使用Nowdoc语法定义的
多行字符串。
变量 $name 不会被解析。
特殊字符如换行符会被保留。
EOT;
echo "<pre>".$text."</pre>";
/* 输出:
这是一个使用Nowdoc语法定义的
多行字符串。
变量 $name 不会被解析。
特殊字符如换行符会被保留。
*/
?>
字符串连接
在PHP中,可以使用点号(.)连接两个或多个字符串:
<?php
$first_name = "John";
$last_name = "Doe";
$full_name = $first_name . " " . $last_name;
echo $full_name; // 输出: John Doe
// 连接多个字符串
$greeting = "Hello, " . $full_name . "! Welcome to PHP.";
echo $greeting; // 输出: Hello, John Doe! Welcome to PHP.
// 连接赋值运算符
$message = "Hello, ";
$message .= "World!";
echo $message; // 输出: Hello, World!
?>
字符串长度和访问
1. 获取字符串长度
可以使用 strlen() 函数获取字符串的长度(以字节为单位):
<?php
$str = "Hello, World!";
echo strlen($str); // 输出: 13
// 注意:strlen()返回的是字节数,不是字符数
$utf8_str = "你好,世界!";
echo strlen($utf8_str); // 输出: 18(假设使用UTF-8编码,每个中文字符占3个字节)
// 使用 mb_strlen() 获取多字节字符的字符数(需要启用mbstring扩展)
echo mb_strlen($utf8_str, "UTF-8"); // 输出: 6
?>
2. 访问和修改字符串中的字符
可以通过方括号语法访问字符串中的单个字符:
<?php
$str = "Hello";
echo $str[0]; // 输出: H
echo $str[1]; // 输出: e
echo $str[4]; // 输出: o
// 尝试访问不存在的索引不会产生错误,而是返回空字符串
// echo $str[10]; // 输出: 空字符串
// 可以修改字符串中的字符
$str = "Hello";
$str[0] = "h";
echo $str; // 输出: hello
// 不能使用这种方式添加字符到字符串末尾
$str = "Hello";
$str[5] = "!";
echo $str; // 仍然输出: Hello
// 要添加字符,需要使用字符串连接
$str = "Hello";
$str .= "!";
echo $str; // 输出: Hello!
?>
字符串比较
1. 使用比较运算符
可以使用标准的比较运算符比较字符串:
<?php
$str1 = "apple";
$str2 = "banana";
// 相等性比较
if ($str1 == $str2) {
echo "字符串相等";
} else {
echo "字符串不相等";
} // 输出: 字符串不相等
// 严格比较(包括类型)
if ($str1 === $str2) {
echo "字符串严格相等";
} else {
echo "字符串严格不相等";
} // 输出: 字符串严格不相等
// 大小比较
if ($str1 < $str2) {
echo "$str1 小于 $str2";
} else {
echo "$str1 大于等于 $str2";
} // 输出: apple 小于 banana
?>
2. 使用字符串比较函数
PHP提供了多个专门用于字符串比较的函数:
<?php
// strcmp() - 按字节比较两个字符串(区分大小写)
// 返回值:0表示相等,负数表示str1小于str2,正数表示str1大于str2
$str1 = "apple";
$str2 = "Apple";
echo strcmp($str1, $str2); // 输出: 32(因为 'a' 的ASCII码比 'A' 大32)
// strcasecmp() - 按字节比较两个字符串(不区分大小写)
echo strcasecmp($str1, $str2); // 输出: 0
// strncmp() - 比较两个字符串的前n个字符(区分大小写)
echo strncmp("apple", "application", 5); // 输出: 0(前5个字符相等)
// strncasecmp() - 比较两个字符串的前n个字符(不区分大小写)
echo strncasecmp("Apple", "application", 5); // 输出: 0
// strnatcmp() - 使用自然排序算法比较字符串(区分大小写)
echo strnatcmp("img10.png", "img2.png"); // 输出: 1("img10.png" > "img2.png")
// strnatcasecmp() - 使用自然排序算法比较字符串(不区分大小写)
echo strnatcasecmp("IMG10.PNG", "img2.png"); // 输出: 1
?>
字符串搜索和替换
1. 字符串搜索
<?php
// strpos() - 查找子串在字符串中首次出现的位置(区分大小写)
$str = "Hello, World!";
$position = strpos($str, "World");
echo $position; // 输出: 7(从0开始计数)
// 如果找不到子串,返回false
$position = strpos($str, "PHP");
echo gettype($position); // 输出: boolean
// 注意:在条件判断中需要使用严格比较
if (strpos($str, "World") !== false) {
echo "找到了'World'";
} else {
echo "没有找到'World'";
}
// stripos() - 查找子串在字符串中首次出现的位置(不区分大小写)
$str = "Hello, World!";
$position = stripos($str, "world");
echo $position; // 输出: 7
// strrpos() - 查找子串在字符串中最后出现的位置(区分大小写)
$str = "Hello, World! Hello, PHP!";
$position = strrpos($str, "Hello");
echo $position; // 输出: 14
// strripos() - 查找子串在字符串中最后出现的位置(不区分大小写)
$position = strripos($str, "hello");
echo $position; // 输出: 14
// strstr() - 返回从子串首次出现位置开始到字符串末尾的部分(区分大小写)
$str = "user@example.com";
$domain = strstr($str, "@");
echo $domain; // 输出: @example.com
// 传递true作为第三个参数,返回子串首次出现位置之前的部分
$username = strstr($str, "@", true);
echo $username; // 输出: user
// stristr() - 类似于strstr(),但不区分大小写
$str = "USER@example.com";
$domain = stristr($str, "@");
echo $domain; // 输出: @example.com
?>
2. 字符串替换
<?php
// str_replace() - 替换字符串中的子串(区分大小写)
$str = "Hello, World!";
$new_str = str_replace("World", "PHP", $str);
echo $new_str; // 输出: Hello, PHP!
// 可以使用数组进行多次替换
$str = "Hello, World! Welcome to PHP.";
$find = array("World", "PHP");
$replace = array("Universe", "Programming");
$new_str = str_replace($find, $replace, $str);
echo $new_str; // 输出: Hello, Universe! Welcome to Programming.
// str_ireplace() - 替换字符串中的子串(不区分大小写)
$str = "Hello, WORLD!";
$new_str = str_ireplace("world", "PHP", $str);
echo $new_str; // 输出: Hello, PHP!
// substr_replace() - 替换字符串的一部分
$str = "Hello, World!";
$new_str = substr_replace($str, "PHP", 7, 5); // 从位置7开始,替换5个字符
echo $new_str; // 输出: Hello, PHP!
// 如果替换长度为0,则是插入操作
$str = "Hello!";
$new_str = substr_replace($str, " beautiful World", 5, 0);
echo $new_str; // 输出: Hello beautiful World!
// 可以使用负数指定从字符串末尾开始计数的位置
$str = "Hello, World!";
$new_str = substr_replace($str, "Universe", -6); // 从末尾第6个字符开始替换到字符串结束
echo $new_str; // 输出: Hello, Universe!
?>
字符串分割和连接
<?php
// explode() - 将字符串分割成数组
$str = "apple,banana,orange,grape";
$fruits = explode(",", $str);
print_r($fruits);
/* 输出:
Array
(
[0] => apple
[1] => banana
[2] => orange
[3] => grape
)
*/
// 第三个参数可以限制返回的数组元素数量
$fruits = explode(",", $str, 2);
print_r($fruits);
/* 输出:
Array
(
[0] => apple
[1] => banana,orange,grape
)
*/
// implode() - 将数组元素连接成字符串
$arr = array("apple", "banana", "orange");
$str = implode(", ", $arr);
echo $str; // 输出: apple, banana, orange
// join() 是 implode() 的别名
$str = join(" | ", $arr);
echo $str; // 输出: apple | banana | orange
// str_split() - 将字符串分割成单个字符的数组
$str = "Hello";
$chars = str_split($str);
print_r($chars);
/* 输出:
Array
(
[0] => H
[1] => e
[2] => l
[3] => l
[4] => o
)
*/
// 可以指定分割长度
$str = "HelloWorld";
$parts = str_split($str, 3);
print_r($parts);
/* 输出:
Array
(
[0] => Hel
[1] => loW
[2] => orl
[3] => d
)
*/
?>
字符串格式化
1. 格式化数字和字符串
<?php
// sprintf() - 返回格式化的字符串
$name = "John";
$age = 30;
$message = sprintf("我的名字是%s,今年%d岁。", $name, $age);
echo $message; // 输出: 我的名字是John,今年30岁。
// printf() - 直接输出格式化的字符串
printf("我的名字是%s,今年%d岁。", $name, $age);
// 格式化说明符的示例
printf("整数: %d<br>", 123); // 整数: 123
printf("浮点数: %.2f<br>", 123.456); // 浮点数: 123.46
printf("字符串: %s<br>", "Hello"); // 字符串: Hello
printf("八进制: %o<br>", 10); // 八进制: 12
printf("十六进制: %x<br>", 255); // 十六进制: ff
printf("大写十六进制: %X<br>", 255); // 大写十六进制: FF
printf("百分比: %%<br>"); // 百分比: %
// 宽度和对齐控制
printf("右对齐,宽度10: %10s<br>", "Hello"); // 右对齐,宽度10: Hello
printf("左对齐,宽度10: %-10s<br>", "Hello"); // 左对齐,宽度10: Hello
printf("前导零,宽度5: %05d<br>", 123); // 前导零,宽度5: 00123
printf("带符号,宽度5: %+5d<br>", 123); // 带符号,宽度5: +123
// vsprintf() - 使用数组作为参数
$args = array("John", 30);
$message = vsprintf("我的名字是%s,今年%d岁。", $args);
echo $message; // 输出: 我的名字是John,今年30岁。
// vprintf() - 类似于vsprintf(),但直接输出
vprintf("我的名字是%s,今年%d岁。", $args);
?>
2. 字符串大小写转换
<?php
$str = "Hello, World!";
// strtoupper() - 将字符串转换为大写
$upper = strtoupper($str);
echo $upper; // 输出: HELLO, WORLD!
// strtolower() - 将字符串转换为小写
$lower = strtolower($str);
echo $lower; // 输出: hello, world!
// ucfirst() - 将字符串的第一个字符转换为大写
$str = "hello, world!";
$ucfirst = ucfirst($str);
echo $ucfirst; // 输出: Hello, world!
// lcfirst() - 将字符串的第一个字符转换为小写
$str = "HELLO, WORLD!";
$lcfirst = lcfirst($str);
echo $lcfirst; // 输出: hELLO, WORLD!
// ucwords() - 将字符串中每个单词的第一个字符转换为大写
$str = "hello world! how are you?";
$ucwords = ucwords($str);
echo $ucwords; // 输出: Hello World! How Are You?
?>
字符串修剪
<?php
$str = " Hello, World! \t\n";
// trim() - 移除字符串两端的空白字符(空格、制表符、换行符等)
$trimmed = trim($str);
echo "[{$trimmed}]"; // 输出: [Hello, World!]
// ltrim() - 移除字符串左侧的空白字符
$ltrimmed = ltrim($str);
echo "[{$ltrimmed}]"; // 输出: [Hello, World!
]
// rtrim() - 移除字符串右侧的空白字符
$rtrimmed = rtrim($str);
echo "[{$rtrimmed}]"; // 输出: [ Hello, World!]
// 可以指定要移除的字符
$str = "***Hello, World!***";
$trimmed = trim($str, "*");
echo $trimmed; // 输出: Hello, World!
$str = "123Hello, World!123";
$ltrimmed = ltrim($str, "0123456789");
echo $ltrimmed; // 输出: Hello, World!123
$rtrimmed = rtrim($str, "0123456789");
echo $rtrimmed; // 输出: 123Hello, World!
?>
字符串操作的其他常用函数
1. 子字符串操作
<?php
// substr() - 返回字符串的子串
$str = "Hello, World!";
$substr = substr($str, 7); // 从位置7开始到字符串结束
echo $substr; // 输出: World!
$substr = substr($str, 0, 5); // 从位置0开始,长度为5的子串
echo $substr; // 输出: Hello
// 可以使用负数指定从字符串末尾开始计数的位置
$substr = substr($str, -6); // 从末尾第6个字符开始到字符串结束
echo $substr; // 输出: World!
$substr = substr($str, -6, 5); // 从末尾第6个字符开始,长度为5的子串
echo $substr; // 输出: World
// str_pad() - 用指定字符填充字符串到指定长度
$str = "Hello";
$padded = str_pad($str, 10, "*");
echo $padded; // 输出: Hello*****
// 第三个参数可以指定填充位置(STR_PAD_LEFT, STR_PAD_RIGHT, STR_PAD_BOTH)
$padded = str_pad($str, 10, "*", STR_PAD_LEFT);
echo $padded; // 输出: *****Hello
$padded = str_pad($str, 10, "*", STR_PAD_BOTH);
echo $padded; // 输出: **Hello***
?>
2. 字符串检查
<?php
// str_starts_with() - 检查字符串是否以指定子串开头(PHP 8.0+)
$str = "Hello, World!";
echo str_starts_with($str, "Hello") ? "是" : "否"; // 输出: 是
echo str_starts_with($str, "World") ? "是" : "否"; // 输出: 否
// str_ends_with() - 检查字符串是否以指定子串结尾(PHP 8.0+)
echo str_ends_with($str, "!") ? "是" : "否"; // 输出: 是
echo str_ends_with($str, "World") ? "是" : "否"; // 输出: 否
// str_contains() - 检查字符串是否包含指定子串(PHP 8.0+)
echo str_contains($str, "World") ? "是" : "否"; // 输出: 是
echo str_contains($str, "PHP") ? "是" : "否"; // 输出: 否
// 在PHP 8.0之前,可以使用strpos()代替这些函数
function str_starts_with_compat($haystack, $needle) {
return strpos($haystack, $needle) === 0;
}
function str_ends_with_compat($haystack, $needle) {
$length = strlen($needle);
if ($length == 0) {
return true;
}
return substr($haystack, -$length) === $needle;
}
function str_contains_compat($haystack, $needle) {
return strpos($haystack, $needle) !== false;
}
?>
3. 字符串反转和重复
<?php
// strrev() - 反转字符串
$str = "Hello, World!";
$reversed = strrev($str);
echo $reversed; // 输出: !dlroW ,olleH
// str_repeat() - 重复字符串指定次数
$str = "Hello ";
$repeated = str_repeat($str, 3);
echo $repeated; // 输出: Hello Hello Hello
?>
PHP字符串综合示例
<?php
// 1. 字符串定义和基本操作
echo "<h4>1. 字符串定义和基本操作</h4>";
// 单引号字符串
$single_quote = 'Hello, World!';
echo "单引号字符串: {$single_quote}<br>";
// 双引号字符串
$name = "John";
$double_quote = "Hello, {$name}!";
echo "双引号字符串: {$double_quote}<br>";
// Heredoc语法
$heredoc = <<<EOT
这是一个使用Heredoc语法定义的多行字符串。
它可以包含变量,如: $name
还可以包含HTML标签,如: <strong>加粗文本</strong>
EOT;
echo "<div style='background:#f0f0f0;padding:10px;'>{$heredoc}</div><br>";
// Nowdoc语法
$nowdoc = <<<'EOT'
这是一个使用Nowdoc语法定义的多行字符串。
它不解析变量,如: $name
也不解析HTML标签,如: <strong>加粗文本</strong>
EOT;
echo "<pre>{$nowdoc}</pre><br>";
// 2. 字符串连接和长度
echo "<h4>2. 字符串连接和长度</h4>";
// 字符串连接
$first_name = "John";
$last_name = "Doe";
$full_name = $first_name . " " . $last_name;
echo "完整姓名: {$full_name}<br>";
// 连接赋值
$greeting = "Hello, ";
$greeting .= $full_name;
echo "问候语: {$greeting}<br>";
// 字符串长度
$str = "Hello, World!";
$length = strlen($str);
echo "字符串'{$str}'的长度: {$length}<br>";
// 多字节字符串长度
$utf8_str = "你好,世界!";
$byte_length = strlen($utf8_str);
echo "UTF-8字符串'{$utf8_str}'的字节长度: {$byte_length}<br>";
// 检查是否安装了mbstring扩展
if (function_exists('mb_strlen')) {
$char_length = mb_strlen($utf8_str, 'UTF-8');
echo "UTF-8字符串'{$utf8_str}'的字符长度: {$char_length}<br>";
} else {
echo "mbstring扩展未安装,无法获取字符长度。<br>";
}
// 3. 字符串搜索和替换
echo "<h4>3. 字符串搜索和替换</h4>";
// 字符串搜索
$str = "The quick brown fox jumps over the lazy dog.";
// 查找子串位置
$position = strpos($str, "fox");
echo "'fox'在字符串中的位置: {$position}<br>";
// 不区分大小写的搜索
$position = stripos($str, "FOX");
echo "不区分大小写,'FOX'在字符串中的位置: {$position}<br>";
// 查找最后出现的位置
$position = strrpos($str, "the");
echo "'the'在字符串中最后出现的位置: {$position}<br>";
// 获取子串后的部分
$domain = strstr("user@example.com", "@");
echo "@后的部分: {$domain}<br>";
// 获取子串前的部分
$username = strstr("user@example.com", "@", true);
echo "@前的部分: {$username}<br>";
// 字符串替换
$str = "Hello, World!";
$new_str = str_replace("World", "PHP", $str);
echo "替换后的字符串: {$new_str}<br>";
// 多次替换
$str = "The quick brown fox jumps over the lazy dog.";
$find = array("quick", "brown", "fox", "lazy", "dog");
$replace = array("slow", "white", "cat", "active", "mouse");
$new_str = str_replace($find, $replace, $str);
echo "多次替换后的字符串: {$new_str}<br>";
// 替换字符串的一部分
$str = "Hello, World!";
$new_str = substr_replace($str, "Universe", 7, 5);
echo "替换部分字符串: {$new_str}<br>";
// 4. 字符串分割和连接
echo "<h4>4. 字符串分割和连接</h4>";
// 分割字符串
$csv = "apple,banana,orange,grape,cherry";
fruits = explode(",", $csv);
echo "分割后的数组: <pre>".print_r($fruits, true)."</pre>";
// 限制分割后的元素数量
$limited_fruits = explode(",", $csv, 3);
echo "限制3个元素的数组: <pre>".print_r($limited_fruits, true)."</pre>";
// 连接数组元素
$arr = array("red", "green", "blue");
$str = implode(", ", $arr);
echo "连接后的字符串: {$str}<br>";
// 使用join()(implode()的别名)
$str = join(" | ", $arr);
echo "使用join()连接的字符串: {$str}<br>";
// 分割成单个字符
$word = "Hello";
$chars = str_split($word);
echo "分割成单个字符: <pre>".print_r($chars, true)."</pre>";
// 5. 字符串格式化
echo "<h4>5. 字符串格式化</h4>";
// 使用sprintf()格式化字符串
$product = "iPhone";
$price = 899.99;
$quantity = 2;
$total = $price * $quantity;
$invoice = sprintf(
"产品: %s<br>单价: $%.2f<br>数量: %d<br>总价: $%.2f<br>",
$product, $price, $quantity, $total
);
echo $invoice;
// 使用printf()直接输出
printf("格式化数字: %05d<br>", 123); // 前导零,宽度5
printf("对齐字符串: %-10s | %10s<br>", "左对齐", "右对齐");
printf("百分比: %.1f%%<br>", 75.5);
// 6. 字符串大小写转换和修剪
echo "<h4>6. 字符串大小写转换和修剪</h4>";
$str = "Hello, World!";
echo "原字符串: {$str}<br>";
echo "大写: ".strtoupper($str)."<br>";
echo "小写: ".strtolower($str)."<br>";
echo "首字母大写: ".ucfirst(strtolower($str))."<br>";
echo "每个单词首字母大写: ".ucwords(strtolower("hello world! how are you?"))."<br>";
// 字符串修剪
$whitespace_str = " Hello, World! \t\n";
echo "原字符串长度: ".strlen($whitespace_str)."<br>";
echo "修剪后字符串: [".trim($whitespace_str)."]<br>";
echo "修剪后长度: ".strlen(trim($whitespace_str))."<br>";
echo "左修剪: [".ltrim($whitespace_str)."]<br>";
echo "右修剪: [".rtrim($whitespace_str)."]<br>";
// 修剪指定字符
$special_str = "---Hello, World!---";
echo "原字符串: {$special_str}<br>";
echo "修剪'-'后: ".trim($special_str, '-')."<br>";
// 7. 子字符串操作
echo "<h4>7. 子字符串操作</h4>";
$str = "The quick brown fox jumps over the lazy dog.";
// 获取子串
$substr1 = substr($str, 0, 10); // 从位置0开始,长度10
$substr2 = substr($str, -30); // 从末尾第30个字符开始
$substr3 = substr($str, 4, -27); // 从位置4开始,到末尾第27个字符结束
echo "原字符串: {$str}<br>";
echo "子串1: {$substr1}<br>";
echo "子串2: {$substr2}<br>";
echo "子串3: {$substr3}<br>";
// 字符串填充
$str = "Hello";
$padded1 = str_pad($str, 10, "*"); // 默认右侧填充
$padded2 = str_pad($str, 10, "*", STR_PAD_LEFT); // 左侧填充
$padded3 = str_pad($str, 10, "*", STR_PAD_BOTH); // 两侧填充
echo "原字符串: {$str}<br>";
echo "右侧填充: [{$padded1}]<br>";
echo "左侧填充: [{$padded2}]<br>";
echo "两侧填充: [{$padded3}]<br>";
// 8. 字符串检查函数(PHP 8.0+)
echo "<h4>8. 字符串检查函数</h4>";
$url = "https://www.example.com";
// 检查是否以指定子串开头
if (function_exists('str_starts_with')) {
$starts_with = str_starts_with($url, "https://");
echo "URL是否以'https://'开头: ".($starts_with ? "是" : "否")."<br>";
}
// 检查是否以指定子串结尾
if (function_exists('str_ends_with')) {
$ends_with = str_ends_with($url, ".com");
echo "URL是否以'.com'结尾: ".($ends_with ? "是" : "否")."<br>";
}
// 检查是否包含指定子串
if (function_exists('str_contains')) {
$contains = str_contains($url, "example");
echo "URL是否包含'example': ".($contains ? "是" : "否")."<br>";
}
// 9. 字符串反转和重复
echo "<h4>9. 字符串反转和重复</h4>";
$str = "Hello, World!";
echo "原字符串: {$str}<br>";
echo "反转后: ".strrev($str)."<br>";
echo "重复3次: ".str_repeat("PHP ", 3)."<br>";
// 10. 实际应用示例
echo "<h4>10. 实际应用示例</h4>";
// 示例1: 格式化电话号码
function format_phone($phone) {
// 移除所有非数字字符
$phone = preg_replace("/[^0-9]/", "", $phone);
// 根据长度格式化
if (strlen($phone) == 11) {
return substr($phone, 0, 3) . "-" . substr($phone, 3, 4) . "-" . substr($phone, 7);
} else if (strlen($phone) == 10) {
return substr($phone, 0, 3) . "-" . substr($phone, 3, 3) . "-" . substr($phone, 6);
}
return $phone;
}
$phone = "13812345678";
echo "格式化前的电话号码: {$phone}<br>";
echo "格式化后的电话号码: ".format_phone($phone)."<br>";
// 示例2: 生成随机密码
function generate_password($length = 12) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()";
$password = "";
$char_count = strlen($chars);
for ($i = 0; $i < $length; $i++) {
$password .= $chars[rand(0, $char_count - 1)];
}
return $password;
}
echo "生成的随机密码: ".generate_password()."<br>";
echo "生成的8位密码: ".generate_password(8)."<br>";
// 示例3: 验证电子邮箱格式
function validate_email($email) {
return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}
$email1 = "user@example.com";
$email2 = "invalid-email";
echo "邮箱'{$email1}'是否有效: ".(validate_email($email1) ? "是" : "否")."<br>";
echo "邮箱'{$email2}'是否有效: ".(validate_email($email2) ? "是" : "否")."<br>";
// 示例4: 提取URL中的域名
function extract_domain($url) {
// 添加协议(如果没有)
if (!preg_match("/^https?:///", $url)) {
$url = "http://".$url;
}
// 解析URL
$parsed = parse_url($url);
// 提取域名
$domain = $parsed["host"];
// 移除www.前缀
$domain = preg_replace("/^www\\./", "", $domain);
return $domain;
}
$url1 = "https://www.example.com/page";
$url2 = "http://subdomain.example.org";
$url3 = "example.net";
echo "URL1的域名: ".extract_domain($url1)."<br>";
echo "URL2的域名: ".extract_domain($url2)."<br>";
echo "URL3的域名: ".extract_domain($url3)."<br>";
// 示例5: 截断过长字符串并添加省略号
function truncate_string($str, $length = 100, $ellipsis = "...") {
if (strlen($str) <= $length) {
return $str;
}
return substr($str, 0, $length - strlen($ellipsis)) . $ellipsis;
}
$long_str = "这是一个非常长的字符串,用于演示如何在不超过指定长度的情况下截断它并添加省略号。这在显示长文本的预览或摘要时非常有用。";
echo "原始字符串: {$long_str}<br>";
echo "截断为30个字符: ".truncate_string($long_str, 30)."<br>";
echo "截断为50个字符: ".truncate_string($long_str, 50)."<br>";
?>