
在PHP应用中处理CSV文件通常涉及文件上传、读取和解析三个步骤。首先,我们需要一个HTML表单来允许用户选择并上传CSV文件。
<form enctype='multipart/form-data' action='' method='post'>
<label>上传CSV文件:</label><br>
<input size='50' type='file' name='filename'><br>
<input type='submit' name='submit' value='上传文件'>
</form>当表单提交后,PHP脚本会接收上传的文件。以下PHP代码片段展示了如何读取CSV文件,并将其内容解析为一个由关联数组组成的数组。每个关联数组代表CSV文件中的一行,其键名对应CSV的标题行。
<?php
if (isset($_POST['submit'])) {
// 检查文件是否成功上传
if (isset($_FILES['filename']) && $_FILES['filename']['error'] == UPLOAD_ERR_OK) {
$file_path = $_FILES['filename']['tmp_name'];
$file = fopen($file_path, "r");
if ($file === false) {
echo "<p style='color:red;'>错误:无法打开上传的文件。</p>";
} else {
$all_rows = array();
$header = fgetcsv($file); // 读取标题行
if ($header === false) {
echo "<p style='color:red;'>错误:CSV文件为空或无法读取标题。</p>";
} else {
while (($row = fgetcsv($file)) !== false) {
// 确保行数据与标题数量匹配,防止array_combine报错
if (count($header) == count($row)) {
$all_rows[] = array_combine($header, $row);
} else {
// 可以选择跳过不匹配的行或记录错误
echo "<p style='color:orange;'>警告:CSV行数据与标题数量不匹配,跳过此行。</p>";
}
}
fclose($file); // 关闭文件句柄
echo "<p style='color:green;'>CSV文件已成功解析。</p>";
// 此时 $all_rows 包含了所有解析后的数据,例如:
/*
Array
(
[0] => Array
(
[query] => https://www.example.com/search/output/person/?loc=%5B%22105490917%22%2C%22101452733%22%5D&keywords=Computational%20Biologist&origin=host
[firstName] => John
[lastName] => Smith
)
// ... 更多行
)
*/
}
}
} else {
echo "<p style='color:red;'>文件上传失败或未选择文件。错误代码: " . ($_FILES['filename']['error'] ?? '未知') . "</p>";
}
}
?>我们的目标是从query键对应的URL中,提取keywords参数的值,并用它替换原始的URL字符串。例如,将https://...&keywords=Computational%20Biologist&origin=host转换为Computational Biologist。
为了实现这一目标,我们可以遍历 $all_rows 数组,并对每个元素的 query 键值应用一系列字符串处理函数:strstr、str_replace、substr 和 urldecode。
立即学习“PHP免费学习笔记(深入)”;
<?php
// 假设 $all_rows 已经通过上述CSV解析代码填充
if (isset($all_rows) && is_array($all_rows)) {
foreach($all_rows as $key => $row_data) {
if (isset($row_data['query'])) {
$original_query = $row_data['query'];
// 1. 使用 strstr 找到 'keywords=' 及其之后的所有内容
// 示例输入: "https://...&keywords=Computational%20Biologist&origin=host"
// 结果: "keywords=Computational%20Biologist&origin=host"
$temp_query = strstr($original_query, 'keywords=');
if ($temp_query !== false) {
// 2. 使用 str_replace 移除 'keywords=' 前缀
// 示例输入: "keywords=Computational%20Biologist&origin=host"
// 结果: "Computational%20Biologist&origin=host"
$temp_query = str_replace('keywords=', '', $temp_query);
// 3. 使用 substr 和 strpos 提取 '&' 之前的部分
// 示例输入: "Computational%20Biologist&origin=host"
// 结果: "Computational%20Biologist"
$amp_pos = strpos($temp_query, "&");
if ($amp_pos !== false) {
$temp_query = substr($temp_query, 0, $amp_pos);
}
// 如果没有找到 '&',则表示 'keywords' 是最后一个参数,
// 此时 $temp_query 已经是我们想要的部分,无需进一步处理 substr。
// 4. 使用 urldecode 解码 URL 编码的字符
// 示例输入: "Computational%20Biologist"
// 结果: "Computational Biologist"
$all_rows[$key]['query'] = urldecode($temp_query);
} else {
// 如果 URL 中没有 'keywords=' 参数,则保留原样或设置为默认值
$all_rows[$key]['query'] = ''; // 或者 $original_query;
}
}
}
// 打印处理后的数组以验证结果
echo "<h3>处理后的数据:</h3>";
echo "<pre>";
print_r($all_rows);
echo "</pre>";
} else {
echo "<p>没有可处理的数据。</p>";
}
?>经过上述处理,$all_rows 数组中的每个 query 键值都将被替换为提取出的、已解码的关键字。
以下是结合了文件上传、CSV解析和URL参数提取的完整PHP脚本。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSV文件处理与URL关键字提取</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
form { border: 1px solid #ccc; padding: 20px; border-radius: 5px; max-width: 50以上就是PHP中处理CSV文件并从URL参数中提取特定关键字的教程的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号