preg_match не работает с шаблоном - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь найти html-теги с помощью PHP, и я не могу понять, что регулярное выражение правильно, я не уверен, что я делаю неправильно.Вот шаблон, который я пытаюсь найти:

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

Я использовал $ resp = htmlentities (file_get_contents ($ url));и выше распечатывает, если я повторяю $ соответственно.Я пытаюсь использовать preg_match для поиска в cas: user для извлечения имени пользователя user29.

Вот шаблон регулярного выражения, который я пытаюсь использовать:

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

Но, похоже, он не работает, когда я отображаю $ match [1].Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Вы анализируете XML с помощью регулярных выражений, что не лучший вариант.Однако, если вы ДОЛЖНЫ использовать регулярные выражения, попробуйте это:

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

РЕДАКТИРОВАТЬ

Ваш код работает, попробуйте echo $match[1];.Спасибо @ Barmar.

1 голос
/ 14 марта 2019

Не пытайтесь анализировать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...