【问题标题】:preg_match not functioning with patternpreg_match 不适用于模式
【发布时间】:2019-03-14 19:54:06
【问题描述】:

我正在尝试使用 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] 时它似乎不起作用。我做错了什么?

【问题讨论】:

  • (如果问题 关于 Python,我会说第一个参数同时包含引号和撇号是可疑的。但据我所知,也许这就是 php有效,所以我不会说什么。)
  • 你的代码对我有用。
  • 见这里:ideone.com/1auScb
  • $match 是一个数组,所以 echo $match; 不起作用。使用print_r()var_dump()

标签: php regex


【解决方案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。

【讨论】:

    【解决方案2】:

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

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

    编辑

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

    【讨论】:

    • 您需要在正则表达式周围使用分隔符。
    • 事实上,他使用的引号被用作分隔符。他的代码有效。
    • 你是对的,现在编辑 :) 再次编辑:你又是对的。没试过,但确实有效。
    • echo $match[1]; 可能是他真正想要的。
    • 我也尝试过 $match[1] ,但它不起作用。将编辑我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2016-07-09
    • 1970-01-01
    • 2013-02-01
    • 2019-11-12
    • 2015-09-01
    相关资源
    最近更新 更多