PHP表单textarea中手机号码的清洗与计数
在Web开发中,经常需要通过表单收集用户输入的信息,其中手机号码是常见的一类数据。当使用<textarea>标签收集多行输入的手机号码时,用户可能会输入各种无关内容,比如空格、换行、特殊符号,甚至夹杂其他非手机号文本。因此,我们需要对textarea提交的内容进行清洗,提取出合法的手机号码并统计数量。
一、需求分析
假设我们有一个包含textarea的表单,用户可以在其中输入多行内容,每行可能包含0个或多个手机号码,也可能包含其他无关字符。我们需要实现以下功能:
清洗输入内容,去除所有非数字字符(仅保留0-9的数字)
从清洗后的内容中匹配符合中国大陆手机号码规则的号码(11位,以1开头,第二位为3-9)
去重统计合法的手机号码总数
输出所有合法的手机号码列表
二、表单结构设计
首先我们需要设计一个简单的表单,使用<textarea>收集用户输入,表单提交方式为POST。示例如下:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>手机号码清洗与计数</title> </head> <body> <form method="post" action=""> <p>请输入手机号码(支持多行输入,可夹杂其他字符):</p> <textarea name="phone_input" rows="10" cols="50"></textarea> <br> <input type="submit" value="提交处理"> </form> </body> </html>
三、后台处理逻辑实现
当用户提交表单后,PHP脚本需要对提交的内容进行处理,核心步骤分为清洗、匹配、去重、统计四个部分。
1. 获取并初步清洗输入内容
首先通过$_POST获取textarea的内容,然后去除所有非数字字符,只保留0-9的数字,方便后续匹配。
<?php
// 初始化结果变量
$phoneList = [];
$totalCount = 0;
$errorMsg = '';
// 判断是否有表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 获取textarea输入内容
$rawInput = isset($_POST['phone_input']) ? $_POST['phone_input'] : '';
if (empty(trim($rawInput))) {
$errorMsg = '请输入内容后再提交';
} else {
// 清洗:只保留数字字符,去除所有非数字内容
$cleanDigits = preg_replace('/D/', '', $rawInput);
// 匹配11位,以1开头,第二位为3-9的手机号码
// 正则表达式说明:1开头,第二位[3-9],后面跟9位数字,总长度11位
preg_match_all('/1[3-9]d{9}/', $cleanDigits, $matches);
if (!empty($matches[0])) {
// 去重处理
$phoneList = array_unique($matches[0]);
// 统计总数
$totalCount = count($phoneList);
}
}
}
?>2. 结果输出
处理完成后,将统计结果和合法的手机号码列表输出到页面上。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>处理结果</title> </head> <body> <?php if (!empty($errorMsg)): ?> <p style="color:red;"><?php echo $errorMsg; ?></p> <?php else: ?> <h3>处理结果</h3> <p>合法手机号码总数:<strong><?php echo $totalCount; ?></strong></p> <?php if ($totalCount > 0): ?> <p>合法手机号码列表:</p> <ul> <?php foreach ($phoneList as $phone): ?> <li><?php echo $phone; ?></li> <?php endforeach; ?> </ul> <?php else: ?> <p>未检测到合法的手机号码</p> <?php endif; ?> <?php endif; ?> <br> <a href="https://www.ipipp.com">返回输入页面</a> </body> </html>
四、完整示例代码
将表单和处理逻辑整合到一个PHP文件中,完整代码如下:
<?php
$phoneList = [];
$totalCount = 0;
$errorMsg = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$rawInput = isset($_POST['phone_input']) ? $_POST['phone_input'] : '';
if (empty(trim($rawInput))) {
$errorMsg = '请输入内容后再提交';
} else {
// 清洗非数字字符
$cleanDigits = preg_replace('/D/', '', $rawInput);
// 匹配合法手机号
preg_match_all('/1[3-9]d{9}/', $cleanDigits, $matches);
if (!empty($matches[0])) {
$phoneList = array_unique($matches[0]);
$totalCount = count($phoneList);
}
}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>PHP表单textarea手机号码清洗与计数</title>
</head>
<body>
<h2>手机号码输入</h2>
<form method="post" action="">
<p>请输入手机号码(支持多行输入,可夹杂空格、换行、特殊符号等其他字符):</p>
<textarea name="phone_input" rows="10" cols="50"><?php echo isset($_POST['phone_input']) ? htmlspecialchars($_POST['phone_input']) : ''; ?></textarea>
<br><br>
<input type="submit" value="提交处理">
</form>
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST'): ?>
<hr>
<h2>处理结果</h2>
<?php if (!empty($errorMsg)): ?>
<p style="color:red;"><?php echo $errorMsg; ?></p>
<?php else: ?>
<p>合法手机号码总数:<strong><?php echo $totalCount; ?></strong></p>
<?php if ($totalCount > 0): ?>
<p>合法手机号码列表:</p>
<ul>
<?php foreach ($phoneList as $phone): ?>
<li><?php echo $phone; ?></li>
<?php endforeach; ?>
</ul>
<?php else: ?>
<p>未检测到合法的手机号码</p>
<?php endif; ?>
<?php endif; ?>
<?php endif; ?>
</body>
</html>五、注意事项
中国大陆手机号码规则可能会更新,若后续有新号段,只需调整正则表达式中的第二位规则即可,例如新增号段可扩展为
1[3-9X](X为新增号段数字)如果用户可能输入其他国家/地区的手机号码,需要调整匹配规则,比如增加国家代码前缀匹配
对于超大文本的输入,建议增加输入长度限制,避免服务器处理压力过大
输出时使用
htmlspecialchars对用户输入的内容进行转义,可以防止XSS攻击,提升安全性