Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
PHP DOMXPath使用双引号工作,使用单引号失败_Php_Xpath_Domxpath - Fatal编程技术网

PHP DOMXPath使用双引号工作,使用单引号失败

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

我编写了一个小脚本,使用PHP的
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计算的实际代码在您的问题中并不清楚。如果你不考虑这一点,这并不容易/