PHP处理字符串

一:字符串分割成数组

日常工作中,如果需要把一个字符串分割成数组,我们一般使用 explode() 函数对字符串进行分割,具体代码如下所示:

<?php

$str = 'PHP|python|java|js|css|html';
$arr = explode('|',$str);
print_r($arr);

参数一:匹配分割的字符

参数二:待分割的字符串

参数三:匹配的次数。默认一致匹配到最后一个

打印的结果如下:

Array
(
    [0] => PHP
    [1] => python
    [2] => java
    [3] => js
    [4] => css
    [5] => html
)

虽然 explode() 函数很方便,但是它只支持固定的分割符,对字符串进行分割。如果需要使用正则进行匹配分割字符串,可以使用 preg_split() 函数

preg_split() 函数是通过正则表达式模式匹配分隔符的方法,实现字符串分割成数组的操作。其基本语法如下:

array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )

参数一:正则表达式

参数二:待匹配的字符串

参数三:匹配的次数。默认-1,表示匹配到最后一个

参数四:特殊参数。以位或运算 | 组合。PREG_SPLIT_NO_EMPTY:仅返回分隔后的非空部分

返回值:匹配的次数。如果没有匹配到返回0

如果不是很了解的可以先看看下方案例:

<?php

$str = '[PHP|python|java]-[js|css|html]';
$arr = preg_split('/[\[\]|,-]/',$str,-1,PREG_SPLIT_NO_EMPTY);
print_r($arr);

打印的结果和上面的 explode() 函数一模一样,但是它所实现的功能却更加强大。

二:正则替换字符串中字符

preg_replace 函数执行一个正则表达式的搜索和替换。语法如下所示:

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

参数一:正则匹配规则

参数二:用于替换的字符串或字符串数组

参数三:要搜索替换的目标字符串或字符串数组

参数四:可选,对于每个模式用于每个 subject 字符串的最大可替换次数。默认是-1(无限制)

参数五:可选,为替换执行的次数。(用于统计被替换的次数)

返回值:如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。

具体表现和用法大家可以看看下方案例,将字符串$string中的PHP替换成Python:

<?php
$string = 'PHP 123, 456';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = 'Python $2,$3';
echo preg_replace($pattern, $replacement, $string);

注意:上述代码$replacement中的$2 和 $3 是正则$pattern 匹配的结果列表中的第二个和第三个结果值

其实可以直接简单点,直接匹配替换:

$string = 'PHP 123, 456';
echo preg_replace('/PHP/','Python',$string);
//打印结果:Python 123, 456

三:正则匹配邮箱

邮箱验证几乎是日常工作中我们必须遇到的问题,例如找回密码及重置密码等行为就可以通过邮箱来验证用户的真假。

要使用正则表达式匹配邮箱,可以使用PHP的preg函数结合邮箱的正则表达式模式。以下是一个示例代码:

<?php
$email = "example@example.com";

// 正则表达式模式匹配邮箱
$pattern = '/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/';
// 使用preg函数进行匹配
if (preg_match($pattern, $email)) {
    echo "邮箱格式正确";
} else {
    echo "邮箱格式错误";
}

在上面的代码中,使用正则表达式模式/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/来匹配邮箱。这个正则表达式模式可以匹配大多数常见的邮箱格式。

正则符号含义:

^:开始符号   $ :结尾符号

正则符号有点多,不明的可以看看百度百科的正则表达式:

https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215

四:正则匹配手机号

正则表达式匹配手机号码,可以使用以下正则表达式模式:

$pattern = '/^1[3456789]\d{9}$/';

这个正则表达式模式匹配以1开头,第二位为3、4、5、6、7、8、9中的任意一个数字,后面跟着9个数字的手机号码。

注意:上面的匹配方式可能会匹配到虚拟手机号,如果想要排除虚拟手机号,可以自己做一个黑名单,把网上的虚拟手机号统统拉进黑名单中。

五:匹配数组中的值

上面的preg_match函数匹配的是字符串,但是PHP提供了 preg_grep 函数用于匹配数组中的值,返回匹配模式的数组条目。语法如下:

array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )

参数一:正则表达式

参数二:待匹配的数组

参数三:如果设置为 PREG_GREP_INVERT,这个函数返回输入数组中与给定模式 pattern 不匹配的元素组成的数组。

返回数组中指定匹配的元素:

<?php
$array = array(1, 2, 3.4, 53, 7.9);
// 返回所有包含浮点数的元素
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
print_r($fl_array);

改正则函数返回的是一个数组格式,数组中是符合匹配的结果值列表。打印结果如下所示:

Array
(
    [2] => 3.4
    [4] => 7.9
)