preg_match不适用于模式

时间:2019-03-14 19:54:06

标签: php regex

我正在尝试使用PHP搜索html标记,但似乎无法正确显示正则表达式,我不确定自己做错了什么。 这是我尝试搜索的模式:

<cas:serviceResponse xmlns:cas='somesite.edu'>
<cas:authenticationSuccess>
<cas:user>user29</cas:user>
</cas:authenticationSuccess>
</cas:serviceResponse>

我用$ resp = htmlentities(file_get_contents($ url));如果我回显$ resp,则上面的内容会打印出来。 我正在尝试使用preg_match在cas:user中搜索以提取用户名user29。

这是我要使用的正则表达式模式:

preg_match("'<cas:user>(.*?)</cas:user>'", $resp, $match);

但是当我回显$ match [1]时,它似乎不起作用。我在做什么错了?

2 个答案:

答案 0 :(得分:1)

您不应该尝试使用正则表达式解析XML。而是使用DOM解析器,如下所示:

$xml = <<< XML
<?xml version="1.0"?>
<cas:serviceResponse xmlns:cas='somesite.edu'>
    <cas:authenticationSuccess>
        <cas:user>user29</cas:user>
    </cas:authenticationSuccess>
</cas:serviceResponse>
XML;

$dom = new DomDocument();
$dom->loadXML($xml);
$xpath = new DomXPath($dom);
$node = $xpath->query("//cas:user");
if ($node->length) {
    echo $node[0]->textContent;
}

这可以在一个平面XML文档中用更少的代码来完成,但是名称空间使事情复杂化了一些,并使使用XPath更容易。

答案 1 :(得分:1)

您正在用正则表达式解析XML,这不是最佳选择。但是,如果必须使用正则表达式,请尝试以下操作:

preg_match("/<cas:user>(.*?)<\/cas:user>/", $resp, $match);

编辑

您的代码有效,请尝试echo $match[1];。感谢@Barmar。

相关问题