Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有常规的Expression或类似的简单方法来检查MediaWiki页面标题是否有效?_Java_Python_Mediawiki - Fatal编程技术网

Java 是否有常规的Expression或类似的简单方法来检查MediaWiki页面标题是否有效?

Java 是否有常规的Expression或类似的简单方法来检查MediaWiki页面标题是否有效?,java,python,mediawiki,Java,Python,Mediawiki,说明MediaWiki页面标题可能不包含的许多条件。使用这种方法,检查字符串是否为有效的MediaWiki页面标题似乎不太容易 检查页面标题是否有效的正则表达式或类似简单方法是什么? 到目前为止,我能找到的最好的是一些Java代码(来自)。不过,我的目标语言是python /** * Convenience method for normalizing MediaWiki titles. (Converts all * underscores to spaces)

说明MediaWiki页面标题可能不包含的许多条件。使用这种方法,检查字符串是否为有效的MediaWiki页面标题似乎不太容易

检查页面标题是否有效的正则表达式或类似简单方法是什么?

到目前为止,我能找到的最好的是一些Java代码(来自)。不过,我的目标语言是python

    /**
     *  Convenience method for normalizing MediaWiki titles. (Converts all
     *  underscores to spaces).
     *  @param s the string to normalize
     *  @return the normalized string
     *  @throws IllegalArgumentException if the title is invalid
     *  @throws IOException if a network error occurs (rare)
     *  @since 0.27
     */
    public String normalize(String s) throws IOException
    {
        // remove leading colon
        if (s.startsWith(":"))
            s = s.substring(1);
        if (s.isEmpty())
            return s;

        int ns = namespace(s);
        // localize namespace names
        if (ns != MAIN_NAMESPACE)
        {
            int colon = s.indexOf(":");
            s = namespaceIdentifier(ns) + s.substring(colon);
        }
        char[] temp = s.toCharArray();
        if (wgCapitalLinks)
        {
            // convert first character in the actual title to upper case
            if (ns == MAIN_NAMESPACE)
                temp[0] = Character.toUpperCase(temp[0]);
            else
            {
                int index = namespaceIdentifier(ns).length() + 1; // + 1 for colon
                temp[index] = Character.toUpperCase(temp[index]);
            }
        }

        for (int i = 0; i < temp.length; i++)
        {
            switch (temp[i])
            {
                // illegal characters
                case '{':
                case '}':
                case '<':
                case '>':
                case '[':
                case ']':
                case '|':
                    throw new IllegalArgumentException(s + " is an illegal title");
                case '_':
                    temp[i] = ' ';
                    break;
            }
        }
        // https://www.mediawiki.org/wiki/Unicode_normalization_considerations
        String temp2 = new String(temp).trim().replaceAll("\\s+", " ");
        return Normalizer.normalize(temp2, Normalizer.Form.NFC);
    }
/**
*规范化MediaWiki标题的简便方法。(将所有
*下划线到空格)。
*@param是要规格化的字符串
*@返回规范化字符串
*如果标题无效,@将引发IllegalArgumentException
*@在发生网络错误时引发IOException(罕见)
*@自0.27起
*/
公共字符串规范化(字符串s)引发IOException
{
//去掉前导冒号
如果(s.startsWith(“:”)
s=s。子串(1);
如果(s.isEmpty())
返回s;
int ns=名称空间;
//本地化命名空间名称
if(ns!=主名称空间)
{
int冒号=s.indexOf(“:”);
s=名称空间标识符(ns)+s.子字符串(冒号);
}
char[]temp=s.toCharArray();
如果(wgCapitalLinks)
{
//将实际标题中的第一个字符转换为大写
if(ns==MAIN_名称空间)
temp[0]=字符.toUpperCase(temp[0]);
其他的
{
int index=namespaceIdentifier(ns).length()+1;//+1表示冒号
temp[index]=字符.toUpperCase(temp[index]);
}
}
对于(int i=0;i
如果您可以调用目标wiki API进行规范化,那么这是一个规范化页面标题的API调用示例:

规范化标题将位于
/query/normalized/0/to
中。您可以一次发送多个标题以使其正常化,并使用
|
将它们分隔开


这个例子取自。

它可能相当没有希望。这在很大程度上也取决于每个wiki的配置。例如,您必须知道wiki有哪些名称空间。@Tgr-感谢您的关注。这适用于完全访问后端Wiki的前端。检查的主要原因是为了避免伪装为pagetitle的代码可能产生的漏洞。通过排除非法字符是否可以完全缓解此风险?如果您是指XSS攻击,那么禁止
可能是个好主意。在某些情况下,代码>和代码>,可以使用引号或空格作为攻击向量,这些都是有效的标题字符;您必须确保标题在使用时正确转义。如果您正在编写在wiki上运行的JS代码,
mw.Html
有一系列转义函数。另外,
mw.Title
有一些相当复杂的验证(与后端逻辑不是100%等价,但很接近)。由于我对后端wiki有一些控制权,我可以修改“合法性”页面标题,例如不允许引用,还有我有点害怕转义字符,比如-,这也取决于url解码过程发生的状态。