讲师中心 微信公众号
AI工具推荐 视频效率加速

MediaWiki API中创建列表项与换行:URL编码的换行符应用指南

云辰吖_3627

云辰吖_3627

发布时间:2025-07-29 21:22:01

|

1085人浏览过

|

来源于php中文网

原创

MediaWiki API中创建列表项与换行:URL编码的换行符应用指南

本教程详细阐述了如何在使用MediaWiki API编辑维基页面时,正确插入换行符以生成列表项。针对常见的\n、\r\n或<br/>无效问题,文章揭示了解决方案:通过URL编码的%0D%0A来模拟回车换行。内容涵盖API请求参数配置、PHP示例代码,并强调了内容编码的重要性,确保API提交的数据能被MediaWiki正确解析,从而实现清晰的列表排版。

问题解析:MediaWiki API中列表项换行失效的原因

在使用mediawiki api通过编程方式编辑维基页面时,开发者常会遇到一个普遍的问题:尝试使用标准换行符(如\n、\r\n)或html换行标签(<br/>)来创建列表项时,所有内容却显示在同一行,无法正确生成分行显示的列表。例如,期望得到:

* 项目一
* 项目二

但实际输出却是:

* 项目一* 项目二

这通常是由于API在接收和解析POST请求中的内容时,对这些传统换行符的处理方式与预期不符。当使用http_build_query等函数构建请求体时,\n或\r\n可能会被URL编码为%0A或%0D%0A。虽然%0D%0A理论上代表回车换行,但MediaWiki的解析器在处理通过API提交的wiki文本时,对这种编码后的换行符可能需要特定的格式才能正确识别为列表项分隔符。

解决方案:利用URL编码的CRLF

解决此问题的关键在于,使用MediaWiki API能够正确识别的URL编码回车换行符序列:%0D%0A。这个序列代表了回车符(CR,\r)和换行符(LF,\n)的组合,即\r\n的URL编码形式。当它被作为wiki文本的一部分提交给API时,MediaWiki的解析器能够将其正确地解释为一次硬换行,从而使得后续的列表标记(如*)能够被识别为新的列表项。

实践示例:PHP中构建MediaWiki API列表内容

以下是一个PHP示例,展示了如何构造包含列表项的wiki文本,并使用cURL通过MediaWiki API进行提交。

  1. 构建列表内容

    在构建列表内容时,每个列表项后都应附加%0D%0A。同时,为了生成标准的维基列表,每个项目前应加上星号*。如果需要创建内部链接,可以使用双层方括号[[...]]。

    <?php
    
    // 假设您已经获取了CSRF Token和API EndPoint
    $csrf_Token = "YOUR_CSRF_TOKEN"; // 替换为实际获取的CSRF Token
    $endPoint = "YOUR_MEDIAWIKI_API_URL"; // 替换为您的MediaWiki API地址,例如:http://yourwiki.com/api.php
    
    $title = "API测试页面 - 列表"; // 要编辑的页面标题
    
    $maps = [];
    $mapNames = ["地图A", "地图B", "地图C"];
    
    foreach ($mapNames as $mapName) {
        // 使用 * 作为列表标记,[[...]] 创建内部链接,并以 %0D%0A 结尾以确保换行
        $maps[] = "* [[" . $mapName . "]]%0D%0A";
    }
    
    // 将所有列表项连接成一个字符串
    $content = implode("", $maps);
    
    // 完整的wiki文本内容,可以包含其他文本
    $fullContent = "这是一个通过API创建的列表:\n\n" . $content . "\n\n更多信息。";
    
    // 准备API请求参数
    $params4 = [
        "action" => "edit",
        "title" => $title,
        "text" => $fullContent, // 提交包含列表的完整内容
        "token" => $csrf_Token,
        "format" => "json"
    ];
    
    // 初始化cURL会话
    $ch = curl_init();
    
    // 设置cURL选项
    curl_setopt( $ch, CURLOPT_URL, $endPoint );
    curl_setopt( $ch, CURLOPT_POST, true ); // 设置为POST请求
    curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params4 ) ); // 构建POST数据
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); // 返回响应内容而不是直接输出
    curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" ); // 保存会话cookie
    curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" ); // 读取会话cookie
    
    // 执行cURL请求
    $output = curl_exec( $ch );
    
    // 检查是否有错误
    if (curl_errno($ch)) {
        echo 'cURL Error: ' . curl_error($ch);
    } else {
        // 输出API响应
        echo "API Response:\n";
        echo json_encode(json_decode($output), JSON_PRETTY_PRINT); // 格式化输出JSON
    }
    
    // 关闭cURL会话
    curl_close( $ch );
    
    ?>
  2. 获取CSRF Token

    在执行编辑操作前,通常需要获取一个CSRF(跨站请求伪造)令牌。这可以通过MediaWiki API的action=query&meta=tokens&type=csrf来获取。

    // 示例:获取CSRF Token的代码片段
    // 假设您已经登录并保存了session cookie
    $tokenParams = [
        "action" => "query",
        "meta" => "tokens",
        "type" => "csrf",
        "format" => "json"
    ];
    
    $ch_token = curl_init();
    curl_setopt($ch_token, CURLOPT_URL, $endPoint . "?" . http_build_query($tokenParams));
    curl_setopt($ch_token, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch_token, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_setopt($ch_token, CURLOPT_COOKIEFILE, "cookie.txt");
    $tokenOutput = curl_exec($ch_token);
    curl_close($ch_token);
    
    $tokenData = json_decode($tokenOutput, true);
    $csrf_Token = $tokenData['query']['tokens']['csrftoken'];
    // ... 然后将 $csrf_Token 用于上面的编辑请求

注意事项

  • URL编码的重要性: 确保%0D%0A作为字面量字符串被包含在$content中,而不是在http_build_query之后才被编码。http_build_query会自动对参数值进行URL编码,但在这里,我们希望%0D%0A本身就是我们想要传递给MediaWiki解析器的“字符序列”,而不是让\r\n被http_build_query再次编码。幸运的是,%本身会被http_build_query编码为%25,但%0D%0A作为整体是MediaWiki期望的特殊序列,因此直接使用它通常是有效的。
  • MediaWiki Markup: 除了*用于无序列表,您还可以使用#创建有序列表。例如,# [[项目]]%0D%0A。
  • API权限: 确保用于API请求的用户账户具有编辑页面的权限。
  • 错误处理: 在实际应用中,务必对cURL的执行结果和API的响应进行详细的错误检查,例如检查curl_exec的返回值、HTTP状态码以及API响应中的error字段。
  • 会话管理: 保持cURL会话的cookie文件(cookie.txt)的正确读取和写入,这对于维持登录状态和获取CSRF令牌至关重要。

总结

通过在MediaWiki API编辑请求中,利用URL编码的%0D%0A作为列表项之间的换行符,可以有效地解决列表内容显示在同一行的问题。这种方法确保了MediaWiki解析器能够正确识别并渲染出结构清晰、分行显示的列表。掌握这一技巧对于自动化维基内容管理和程序化生成页面具有重要意义。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

11319

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1006

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

764

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1846

2025.08.19

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

3463

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

755

2023.10.30

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

929

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2620

2023.10.25

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn