Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
MediaWiki API中创建列表项与换行:URL编码的换行符应用指南_创想鸟

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

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

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

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

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

* 项目一* 项目二

但实际输出却是:

* 项目一* 项目二

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

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

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

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

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

构建列表内容

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

 "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" ); // 保存会话cookiecurl_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 );?>

获取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解析器的“字符序列”,而不是让rn被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解析器能够正确识别并渲染出结构清晰、分行显示的列表。掌握这一技巧对于自动化维基内容管理和程序化生成页面具有重要意义。

以上就是MediaWiki API中创建列表项与换行:URL编码的换行符应用指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1319552.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
优化 Laravel Eloquent 查询:高效构建用户排行榜数据
上一篇 2025年12月12日 05:31:44
MediaWiki API:解决通过 text 参数提交内容时项目符号换行问题
下一篇 2025年12月12日 05:32:00

相关推荐

  • 使用 Java 获取 ISO 8601 格式的日期和时间

    使用 Java 获取 ISO 8601 格式的日期和时间使用 Java 获取 ISO 8601 格式的日期和时间使用 Java 获取 ISO 8601 格式的日期和时间使用 Java 获取 ISO 8601 格式的日期和时间

    本文介绍了如何使用 Java 获取符合 ISO 8601 标准的日期和时间字符串,例如 2022-10-03T19:45:47.844Z。我们将探讨使用 java.time.Instant 类来获取 UTC 时间,并将其格式化为所需的字符串表示形式。同时,我们还会讨论时间精度以及如何避免使用过时的日…

    2026年9月24日 • 用户投稿
    100
  • VSCode怎样用调试控制台执行临时代码片段 VSCode 调试控制台执行临时代码的创新用法​

    是的,vscode调试控制台可在调试时执行代码片段并查看复杂对象。1. 启动调试会话并打开调试控制台(ctrl+shift+y);2. 直接输入代码访问或修改变量,如myvar=20;3. 执行函数调用或复杂表达式验证逻辑;4. 查看复杂对象时点击展开箭头、使用console.dir()或json.…

    2026年9月23日
    400
  • 在Java中如何格式化输出日期与时间

    推荐使用Java 8的DateTimeFormatter格式化日期时间,配合LocalDateTime或ZonedDateTime实现安全高效输出,如yyyy-MM-dd HH:mm:ss;2. 传统SimpleDateFormat非线程安全,适用于旧版本。 在Java中格式化输出日期与时间,常用的…

    2026年9月22日
    400
  • Java Swing中按钮与文本框事件处理的实践指南

    本文将深入探讨Java Swing中ActionListener的正确使用方法,指导开发者如何为GUI按钮和文本框实现事件监听,从而处理用户输入、执行计算并实时更新界面。文章将重点讲解如何在actionPerformed方法中获取用户输入、进行类型转换、处理潜在异常,并提供一个完整的计算器示例来演示…

    2026年9月22日
    200
  • MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板

    MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板MySQL字段映射表自动生成方案_Sublime一键导出JSON与结构化模板

    如何利用sublime text插件提升mysql字段映射表生成效率?1. 插件通过自动化提取sql语句中的表结构信息,减少手动操作;2. 支持一键导出为json或结构化模板(如markdown、html表格),提升开发效率;3. 利用sublime text的python插件机制,实现快速集成与执…

    2026年9月22日 • 用户投稿
    000
  • 如何在Java中实现简单的输入输出

    使用Scanner类读取键盘输入,需导入java.util.Scanner并创建实例;2. 调用nextInt、nextLine等方法获取不同类型数据,注意nextInt不读取换行符可能导致nextLine读取空字符串;3. 推荐使用后关闭Scanner;4. 输出通过System.out.prin…

    2026年9月21日
    000
  • time函数处理时间在mysql中如何操作

    MySQL中的时间函数用于处理时间数据,如获取当前时间用NOW()或CURTIME(),提取时间部分用TIME(),格式化输出用TIME_FORMAT(),时间计算可用TIMEADD()、TIMEDIFF()等函数,支持加减和差值运算,需注意字段类型与格式匹配。 在 MySQL 中,time 函数和…

    2026年9月20日
    200
  • JAXB中动态获取Java对象QName并创建JAXBElement的反射策略

    本文探讨了在jaxb中,当`jaxbintrospector.getelementname`无法获取java对象对应的`qname`时,如何通过反射机制调用`objectfactory`中生成的`create`方法来动态创建`jaxbelement`。该方法避免了大量类型判断,提高了代码的灵活性和可…

    2026年9月20日
    100
  • Python中print函数使用详解

    Python中print函数使用详解Python中print函数使用详解Python中print函数使用详解Python中print函数使用详解

    1、 输出常见数据类型如字符串与整数 2、 对输出结果进行格式化处理 立即学习“Python免费学习笔记(深入)”; 3、 实现浮点数的格式化输出 4、 关闭自动换行功能 以上就是Python中print函数使用详解的详细内容,更多请关注创想鸟其它相关文章!

    2026年9月20日 • 用户投稿
    200
  • Linux输出文本echo命令应用

    echo命令不仅能输出文本,还可结合变量、转义序列和重定向实现动态内容生成、文件创建与追加、配置修改、管道处理及脚本调试,其行为在Bash、Zsh和Dash等shell中因内置实现不同而存在差异,尤其在转义序列处理上需注意使用-e选项或改用printf以保证一致性。 echo 命令在 Linux 中…

    2026年9月20日
    000
  • 如何在mysql中使用日期函数处理时间数据

    MySQL常用日期函数包括:NOW()、CURDATE()、CURTIME()获取当前时间;YEAR()、MONTH()、DAY()等提取日期部分;DATE_FORMAT()自定义格式化输出;DATE_ADD()、DATE_SUB()进行日期加减;DATEDIFF()和TIMESTAMPDIFF()…

    2026年9月12日
    300
  • 如何使用Java的LocalDate与LocalDateTime类

    LocalDate和LocalDateTime是Java 8引入的不带时区的日期时间类,分别表示年月日和年月日时分秒,适用于生日、订单时间等场景,提供now()、of()、plus/minus、isBefore/isAfter等方法支持创建、计算和比较操作,通过ChronoUnit可计算日期间隔,配…

    2026年9月11日
    100
  • 如何在Java中格式化输出内容

    最常用Java格式化输出方式是System.out.printf()和String.format()。前者直接输出到控制台,后者生成字符串;支持%d、%f、%s等占位符,可控制宽度、对齐(如%-10s)和精度(如%.2f),推荐用%n换行,结合DateTimeFormatter可格式化时间。 在Ja…

    2026年9月11日
    000
  • Java中二维数组的格式化输出:实现对齐的乘法表打印

    本文旨在指导java开发者如何优雅地格式化输出二维数组,特别是乘法表,以实现数字的整齐对齐。通过分析`arrays.tostring()`的局限性,我们将重点介绍并演示如何利用`system.out.printf()`方法及其格式化字符串功能,精确控制输出的字段宽度和对齐方式,从而生成美观且易读的表…

    2026年9月11日
    100
  • Laravel模型时间戳?时间戳怎样管理使用?

    Laravel模型默认使用时间戳以实现“约定优于配置”,自动记录数据的创建和更新时间,通过created_at和updated_at字段提供数据追踪能力。框架底层将时间戳存储为DATETIME或TIMESTAMP类型,并在模型中转换为Carbon实例,便于格式化和比较。可通过对模型设置$timest…

    2026年9月11日
    100
  • Java中DecimalFormat数字格式化详解

    答案:DecimalFormat通过模式字符串格式化浮点数,支持占位符如0、#、.、,、%等,可自定义小数位、千分位、百分比输出,示例中1234.5678用”0.00″保留两位小数得1234.57,用”#,##0.##”加千分位并省略末尾零得1,234…

    2026年9月9日
    000
  • Java中如何创建一个简易的公告发布工具

    答案:通过定义Notice类封装公告信息,使用Scanner获取用户输入标题、内容和时间,并调用toString方法格式化输出;接着利用FileWriter将公告追加写入notice.txt文件实现持久化存储;最后可扩展循环发布、历史查看和菜单功能。该工具结合类设计、控制台输入与文件I/O操作,适合…

    2026年9月9日
    000
  • Java Swing中实现按钮事件与用户输入处理的完全指南

    本教程详细介绍了如何在Java Swing应用程序中为多个按钮和文本输入框实现ActionListener。我们将学习如何通过ae.getSource()识别事件源,在actionPerformed方法中正确获取并解析用户输入,执行计算,并将结果显示到GUI界面,同时涵盖必要的错误处理机制,确保程序…

    2026年9月8日
    600
  • Vue.js中如何通过两个接口渲染表格数据并进行数据格式化?

    Vue.js:高效渲染双接口表格数据并进行格式化 本文将演示如何在Vue.js应用中,利用两个不同的接口数据渲染表格,并对其中一个接口的返回数据进行精细化格式化处理。 挑战:整合与格式化来自不同数据源的数据 我们的目标是创建一个表格,它同时显示来自两个独立API接口的数据。其中一个接口提供表格的主体…

    2026年9月7日
    200
  • JPA 中如何格式化IDEA控制台打印的SQL语句?

    优化IDEA控制台JPA SQL打印输出 使用JPA时,启用show-sql: true可以在控制台查看执行的SQL语句。然而,默认输出为单行显示,可读性差。本文介绍如何格式化SQL输出,提升可读性。 关键在于Hibernate的hibernate.format_sql属性。默认值为false,导致…

    2026年9月4日
    100

发表回复

登录后才能评论
关注微信