Encoding 维基百科(MediaWiki)URI编码方案
Wikipedia(或MediaWiki)如何在URI中编码页面标题?这不是正常的URI编码,因为空格被替换为下划线,双引号不被编码,诸如此类。这个过程相当复杂,也不太漂亮。您需要查看Encoding 维基百科(MediaWiki)URI编码方案,encoding,uri,mediawiki,wikipedia,Encoding,Uri,Mediawiki,Wikipedia,Wikipedia(或MediaWiki)如何在URI中编码页面标题?这不是正常的URI编码,因为空格被替换为下划线,双引号不被编码,诸如此类。这个过程相当复杂,也不太漂亮。您需要查看includes/Title.php中的Title类。您应该从newFromText方法开始,但是大部分逻辑都在secureAndSplit方法中 请注意(与MediaWiki一样),代码丝毫没有解耦。如果要复制它,需要提取逻辑,而不是简单地重复使用该类 逻辑如下所示: 解码字符引用(例如é;) 将空
includes/Title.php
中的Title
类。您应该从newFromText
方法开始,但是大部分逻辑都在secureAndSplit
方法中
请注意(与MediaWiki一样),代码丝毫没有解耦。如果要复制它,需要提取逻辑,而不是简单地重复使用该类
逻辑如下所示:
- 解码字符引用(例如é;)
- 将空格转换为下划线
- 检查标题是否是对命名空间或interwiki的引用
- 删除散列片段(例如
Apple\Name
- 删除禁止字符
- 禁止子目录链接(例如,
)。/directory/page
- 禁止三重平铺序列(
)(出于某种原因)~~
- 将大小限制为255字节
- 将第一个字母大写
您还可以参考index.php文件,在Wikipedia上找到这样一篇文章:
http://en.wikipedia.org/w/index.php?title=Foo%20bar
并被引擎重定向到http://en.wikipedia.org/wiki/Foo_bar
。幕后mod_rewrite将其转换为/index.php?title=Foo_bar。对于MediaWiki引擎,它是相同的好像您访问了http://en.wikipedia.org/w/index.php?title=Foo_bar
-此页面不会重定向您。我相信mod_rewrite
不会将URL重写到index.php?title=Foo_bar
。链接被重写(如果有的话)到index.php/Foo_bar
,然后由$\u服务器['REQUEST\u URI'读取
或类似的东西。节名([[Apple#Name here]]和#Name#U here bit)是如何处理的…?你说的“删除散列片段”就像它们被忽略一样。“禁止三重平铺序列(~~~)(出于某种原因)”–在页面保存时对签名使用三重平铺,因此在标题中不允许它们是有意义的(链接到这样一个页面可能会很棘手或不可能)。