我在xml中有一个字符串
<DetailPageURL>http://www.amazon.com/exec/obidos/redirect?tag=bookmooch-20%26link_code=xm2%26camp=2025%26creative=165953%26path=http://www.amazon.com/gp/redirect.html%253fASIN=0001714600%2526tag=bookmooch-20%2526lcode=xm2%2526cID=2025%2526ccmID=165953%2526location=/o/ASIN/0001714600%25253FSubscriptionId=1AQVTEDADRW2C3ZDPCG2</DetailPageURL>
我想对此应用限制,它应始终以:
开头http://www.amazon.com/exec/obidos/redirect?
这是我的代码:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="DetailPageURL">
<xsd:simpleType>
<xsd:restriction base="xsd:anyURI">
<xsd:pattern value="http://www.amazon.com/exec/obidos/redirect?[A-Za-z0-9]"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:schema>
它显然不起作用,因为我没有在其中添加=%-_等特殊字符。但我的问题是,如果我在我的模式中添加它:
<xsd:pattern value="http://www.amazon.com/exec/obidos/redirect?[A-Za-z0-9=-_%:/.]"/>
它会起作用吗?这是正确的做法吗?
答案 0 :(得分:1)
这样的事情:
http://www\.amazon\.com/exec/obidos/redirect\?.+
应该足够了。正如Ian在评论中所说,以anyURI
作为基本限制已经负责验证URL的一般结构,因此足以验证所需的前缀。
请务必记住.
和?
等元字符。
答案 1 :(得分:1)
Michael Sperberg-McQueen定义了匹配的类型
中的不同风格的URIhttp://www.w3.org/2011/04/XMLSchema/TypeLibrary-URI-RFC3986.xsd
和
http://www.w3.org/2011/04/XMLSchema/TypeLibrary-IRI-RFC3987.xsd
要查看这些复杂正则表达式的构造方式,请查看 这些文档在原始XML级别使用(例如)curl。
答案 2 :(得分:0)
如果您想确保以您指定的字符串开头的任何合法IRI,并且只有那些,对您的类型有效,您将需要
(1)导入Michael Kay的答案中提到的IRI类型,然后使用Matti Virkunen建议的模式(或更宽松的模式,用。替换。)来限制它们。
或
(2)使用类似
的模式 http://www\.amazon\.com/exec/obidos/redirect\?(([A-Za-z0-9\-\._~ -퟿豈-﷏ﷰ-￯𐀀-🿽𠀀-𯿽𰀀-𿿽񀀀-񏿽񐀀-񟿽񠀀-񯿽񰀀-񿿽򀀀-򏿽򐀀-򟿽򠀀-򯿽򰀀-򿿽󀀀-󏿽󐀀-󟿽󡀀-󯿽]|(%[0-9A-Fa-f][0-9A-Fa-f])|[!$&'()*+,;=:@])|[-󰀀-󿿽􀀀-􏿽/?])*
通过手动扩展Michael Kay提到的类型中的实体iquery
的定义来构建此模式。它表明,匹配URI或IRI的实际语法并不是那么难,尽管有时候有点单调乏味。
导入绝对URI-3986或绝对IRI-3987类型然后进一步限制它们更简单,更不容易出错。