当我使用simplexml_load_file()时,为什么preg_match()结果在PHP中显示0?

时间:2015-12-24 16:35:34

标签: php xml

我有一些php的问题,这是我的代码

test.xml如:

<?xml version='1.0'?>
<document responsecode="200">
  <result count="10" start="0" totalhits="133047950">
    <title>Test</title>
    <from id = "jack">655</from>
    <to>Tsung</to>
  </result>
</document>

php代码:

<?php
header("content-type:text/html; charset=utf-8");
$xml = simplexml_load_file("test.xml");
$text = htmlspecialchars($xml->asXML());
$pattern = "/</";
$result = preg_match($pattern,$text);
echo $result;
?>

结果显示为“0”,表示未找到,所以我更改$ pattern value

$pattern = "document" ;

结果是显示“1”(它的意思是找到)

我调试了很多时间......

也许编码UTF-8,ASCII问题或OR "/</"错误?

我的目的是要解析此字符串然后获取

'<title> .. </title>'
有人可以告诉我,我的错误在哪里?谢谢:))

3 个答案:

答案 0 :(得分:2)

您正在使用解析器,只需解析它,不需要正则表达式。

$xml = '<?xml version=\'1.0\'?>
<document responsecode="200">
  <result count="10" start="0" totalhits="133047950">
    <title>Test</title>
    <from id = "jack">655</from>
    <to>Tsung</to>
  </result>
</document>';
$xml = new SimpleXMLElement($xml);
echo $xml->result->title->asXML();

输出:

<title>Test</title>

正如其他答案所述,问题在于您使用htmlspecialchars。你的正则表达式也不够具体,无法找到title元素。如果您需要使用正则表达式,您可以这样做:

/((<|&lt;)title(>|&gt;).*?\2\/title\3)/

演示:https://regex101.com/r/kM8tR8/1

捕获组1将包含您的标题元素。如果标题文本可以扩展多行,请添加s修饰符。

答案 1 :(得分:1)

问题是iostat 1 10会将特殊字符转换为HTML实体,例如htmlspecialchars()<&lt;>等等。所以如果要解析xml文档并获取&gt;然后您可以执行以下操作:

title

答案 2 :(得分:1)

请勿致电htmlspecialchars,将所有XML标记转换为HTML实体。

<?php
header("content-type:text/html; charset=utf-8");
$xml = simplexml_load_file("test.xml");
$text = $xml->asXML();
$pattern = "/</";
$result = preg_match($pattern,$text);
echo $result;
?>