gpt4 book ai didi

PHP - 使用 unicode 正则表达式的 XSD 模式验证错误

转载 作者:数据小太阳 更新时间:2023-10-29 02:37:04 27 4
gpt4 key购买 nike

描述:

当我尝试使用包含 Unicode 常规的给定 XSD 模式验证 XML 文件时表达式,函数 DOMDocument::schemaValidate 返回验证错误。XSD 模式是 W3C 格式良好的,并且验证通过了另一个验证工具。如果 XSD 模式是这样的格式(没有正方形括号):

<xsd:pattern value="\P{Ll}+"/>

PHP 版本:5.2.14
LibXml 版本:2.7.7

先前的模式 [\P{Ll}]+preg_match 函数一起正常工作。


测试脚本:

PHP 验证码:

function libxml_display_errors()
{
$errors = libxml_get_errors();

print_r($errors);

libxml_clear_errors();
}

libxml_use_internal_errors(true);

$dom = new DOMDocument();
$dom->load('test.xml');

if ( !$dom->schemaValidate('test.xsd') ) {
echo "XML Error\n";
libxml_display_errors();
} else {
echo "XML ok\n";
}

XSD 架构:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:simpleType name="noLowerCase">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[\P{Ll}]+"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="DatiUtenteType">
<xsd:sequence>
<xsd:element name="Cognome" type="noLowerCase"/>
<xsd:element name="Nome" type="noLowerCase"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="DataExchangeFisso">
<xsd:sequence>
<xsd:element name="DatiUtente" type="DatiUtenteType"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="ListOfDataExchange">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="DataExchangeFisso" type="DataExchangeFisso" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<ListOfDataExchange>
<DataExchangeFisso>
<DatiUtente>
<Cognome>FOO</Cognome>
<Nome>BAR</Nome>
</DatiUtente>
</DataExchangeFisso>
</ListOfDataExchange>

预期结果:

XML ok

实际结果:

XML Error
Array
(
[0] => LibXMLError Object
(
[level] => 2
[code] => 1839
[column] => 0
[message] => Element 'Cognome': [facet 'pattern'] The value 'FOO' is not accepted by the pattern '[\P{Ll}]+'.
[file] => /var/www/html/test.xml
[line] => 5
)

[1] => LibXMLError Object
(
[level] => 2
[code] => 1824
[column] => 0
[message] => Element 'Cognome': 'FOO' is not a valid value of the atomic type 'noLowerCase'.
[file] => /var/www/html/test.xml
[line] => 5
)

[2] => LibXMLError Object
(
[level] => 2
[code] => 1839
[column] => 0
[message] => Element 'Nome': [facet 'pattern'] The value 'BAR' is not accepted by the pattern '[\P{Ll}]+'.
[file] => /var/www/html/test.xml
[line] => 6
)

[3] => LibXMLError Object
(
[level] => 2
[code] => 1824
[column] => 0
[message] => Element 'Nome': 'BAR' is not a valid value of the atomic type 'noLowerCase'.
[file] => /var/www/html/test.xml
[line] => 6
)
)

最佳答案

这不是您问题的完整答案,但可能是一些澄清:

XSD 中的正则表达式,即使它可能类似于带有 preg_match 的正则表达式,也是不同的东西。因此假设某些东西必须与 XSD 一起工作,因为它确实与 preg_match 一起工作是一个猜测,但不是严格的测试。

categoryDocs 小写字母及其属性 Ll 由 Unicode 定义,XSD 库应该支持它。

可能是类别的否定性有问题,因为它只说什么不是,而不是非负面字符类中的什么。

尝试:

[^\p{Ll}]+

关于PHP - 使用 unicode 正则表达式的 XSD 模式验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8891828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com