PHP DOMXPath使用双引号工作,使用单引号失败
我编写了一个小脚本,使用PHP的PHP DOMXPath使用双引号工作,使用单引号失败,php,xpath,domxpath,Php,Xpath,Domxpath,我编写了一个小脚本,使用PHP的DOMXPath类从网站中提取信息。 我查询并在结果上执行之前的子字符串。结果包含文本、不间断空格、换行符和更多文本。 所以我要做的是在\r\n之前剪切。当我使用以下查询时,它可以正常工作: $query = "substring-before(//div[@class='sku'],'\xC2\xA0\xC2\xA0\r\n')"; 但一旦我更改了引号(这不会有任何区别),就会失败: 或 这是怎么可能的,我如何克服它? 这里有一个活生生的例子:您可以用简单的h
DOMXPath
类从网站中提取信息。我查询
并在结果上执行之前的子字符串。结果包含文本、不间断空格、换行符和更多文本。
所以我要做的是在\r\n
之前剪切。当我使用以下查询时,它可以正常工作:
$query = "substring-before(//div[@class='sku'],'\xC2\xA0\xC2\xA0\r\n')";
但一旦我更改了引号(这不会有任何区别),就会失败:
或
这是怎么可能的,我如何克服它?
这里有一个活生生的例子:您可以用简单的html\U dom轻松地完成这项工作
下载:
手册:
您可以使用简单的html\U dom轻松实现这一点
下载:
手册:
您可以使用简单的html\U dom轻松实现这一点
下载:
手册:
您可以使用简单的html\U dom轻松实现这一点
下载:
手册:
引号的样式会有所不同,因为-包括用于不间断空格的内容\xC2\xA0
、回车\r
和换行符\n
当将它们括在单引号中时,就像在后两个查询中一样,PHP将它们视为文字字符-反斜杠、x、C、2。。。等等
一些额外的语法高亮显示可能有助于展示这一点,橙色转义序列:
如果您的字符串中已经有可能是转义序列的文字字符,并且没有办法更正它*,那么您将处于一种肮脏的境地,需要自己替换它们
这个preg\u replace\u callback()
将处理示例中的序列类型,扩展到双引号支持的其余转义序列是很简单的:
// Known good.
$query1 = "substring-before(//div[@class='sku'],'\xC2\xA0\xC2\xA0\r\n')";
// Known bad.
$query2 = 'substring-before(//div[@class=\'sku\'],\'\xC2\xA0\xC2\xA0\r\n\')';
$query2 = preg_replace_callback(
'/\\\\(?:[rn]|(?:x[0-9A-Fa-f]{1,2}))/',
function ($matches) {
switch (substr($matches[0], 0, 2)) {
case '\r':
return "\r";
case '\n':
return "\n";
case '\x':
return hex2bin(substr($matches[0], 2));
}
},
$query2
);
var_dump($query1 === $query2); // Now equal?
输出:
bool(true)
(*真的,你应该在源代码处解决这个问题。)引号的样式会有所不同,因为-包括用于非中断空格\xC2\xA0
、回车\r
和换行\n
当将它们括在单引号中时,就像在后两个查询中一样,PHP将它们视为文字字符-反斜杠、x、C、2。。。等等
一些额外的语法高亮显示可能有助于展示这一点,橙色转义序列:
如果您的字符串中已经有可能是转义序列的文字字符,并且没有办法更正它*,那么您将处于一种肮脏的境地,需要自己替换它们
这个preg\u replace\u callback()
将处理示例中的序列类型,扩展到双引号支持的其余转义序列是很简单的:
// Known good.
$query1 = "substring-before(//div[@class='sku'],'\xC2\xA0\xC2\xA0\r\n')";
// Known bad.
$query2 = 'substring-before(//div[@class=\'sku\'],\'\xC2\xA0\xC2\xA0\r\n\')';
$query2 = preg_replace_callback(
'/\\\\(?:[rn]|(?:x[0-9A-Fa-f]{1,2}))/',
function ($matches) {
switch (substr($matches[0], 0, 2)) {
case '\r':
return "\r";
case '\n':
return "\n";
case '\x':
return hex2bin(substr($matches[0], 2));
}
},
$query2
);
var_dump($query1 === $query2); // Now equal?
输出:
bool(true)
(*真的,你应该在源代码处解决这个问题。)引号的样式会有所不同,因为-包括用于非中断空格\xC2\xA0
、回车\r
和换行\n
当将它们括在单引号中时,就像在后两个查询中一样,PHP将它们视为文字字符-反斜杠、x、C、2。。。等等
一些额外的语法高亮显示可能有助于展示这一点,橙色转义序列:
如果您的字符串中已经有可能是转义序列的文字字符,并且没有办法更正它*,那么您将处于一种肮脏的境地,需要自己替换它们
这个preg\u replace\u callback()
将处理示例中的序列类型,扩展到双引号支持的其余转义序列是很简单的:
// Known good.
$query1 = "substring-before(//div[@class='sku'],'\xC2\xA0\xC2\xA0\r\n')";
// Known bad.
$query2 = 'substring-before(//div[@class=\'sku\'],\'\xC2\xA0\xC2\xA0\r\n\')';
$query2 = preg_replace_callback(
'/\\\\(?:[rn]|(?:x[0-9A-Fa-f]{1,2}))/',
function ($matches) {
switch (substr($matches[0], 0, 2)) {
case '\r':
return "\r";
case '\n':
return "\n";
case '\x':
return hex2bin(substr($matches[0], 2));
}
},
$query2
);
var_dump($query1 === $query2); // Now equal?
输出:
bool(true)
(*真的,你应该在源代码处解决这个问题。)引号的样式会有所不同,因为-包括用于非中断空格\xC2\xA0
、回车\r
和换行\n
当将它们括在单引号中时,就像在后两个查询中一样,PHP将它们视为文字字符-反斜杠、x、C、2。。。等等
一些额外的语法高亮显示可能有助于展示这一点,橙色转义序列:
如果您的字符串中已经有可能是转义序列的文字字符,并且没有办法更正它*,那么您将处于一种肮脏的境地,需要自己替换它们
这个preg\u replace\u callback()
将处理示例中的序列类型,扩展到双引号支持的其余转义序列是很简单的:
// Known good.
$query1 = "substring-before(//div[@class='sku'],'\xC2\xA0\xC2\xA0\r\n')";
// Known bad.
$query2 = 'substring-before(//div[@class=\'sku\'],\'\xC2\xA0\xC2\xA0\r\n\')';
$query2 = preg_replace_callback(
'/\\\\(?:[rn]|(?:x[0-9A-Fa-f]{1,2}))/',
function ($matches) {
switch (substr($matches[0], 0, 2)) {
case '\r':
return "\r";
case '\n':
return "\n";
case '\x':
return hex2bin(substr($matches[0], 2));
}
},
$query2
);
var_dump($query1 === $query2); // Now equal?
输出:
bool(true)
(*真的,你应该从源头上解决这个问题。)谢谢你的回答。我知道有几种方法可以做到这一点。但是,我想继续使用xPath,我想知道这个问题是怎么可能的。谢谢你的回答。我知道有几种方法可以做到这一点。但是,我想继续使用xPath,我想知道这个问题是怎么可能的。谢谢你的回答。我知道有几种方法可以做到这一点。但是,我想继续使用xPath,我想知道这个问题是怎么可能的。谢谢你的回答。我知道有几种方法可以做到这一点。但是,我想继续使用xPath,我想知道这个问题是怎么可能的。你说“当我…,它工作正常。”然后说“我如何克服这个问题?”使用工作正常的版本怎么样?我想你真正的问题是“为什么这会有不同的表现?”你是否将PHP代码保存到数据库中,然后eval
evaluate它?请完成您的示例,xpath计算的实际代码在您的问题中并不清楚。如果你不考虑这一点,这并不容易/