Don’t use Regex for that, not that it won’t work, but if anything changes in xml SOAP you will have to maintain your regex for sure, and until maintenance occurs everything will be broken.
What you can (and should preferably) use is DOMDocument
+DOMXapth
(or other DOM Apis for PHP), example that will solve your case:
<?php
$xml = '<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ConsultarRequest>
<Cliente>
<sistema>XPTO</sistema>
</Cliente>
<numDDD>xx</numDDD>
<numTerminal>xxxxxxxx</numTerminal>
</ConsultarRequest>
</soapenv:Body>
</soapenv:Envelope>';
$encontrou = false;
$doc = new DOMDocument;
$doc->loadxml($xml);
$xpath = new DOMXpath($doc);
//Registrado o namespace para que a query funcione com ele
$xpath->registerNamespace('soapenv', 'http://schemas.xmlsoap.org/soap/envelope/');
//O `//` busca o elemento <soapenv:Body> em QUALQUER parte do documento
$elementos = $xpath->query("//soapenv:Body");
//Verifica se retornou pelo menos um elemento
if ($elementos) {
//Dentro <soapenv:Body> pega o primeiro elemento, que no seu exemplo é o `<ConsultarRequest>`, mas pode variar dependendo da resposta
$node = $elementos[0]->getElementsByTagName('*')->item(0);
//Se encontrar um elemento então entra na IF
if ($node) {
$encontrou = true;
//Pega o conteudo do primeiro elemento, incluindo ele, e transforma em uma string
$html = $node->ownerDocument->saveHTML( $node );
echo 'Resultado:<br>';
echo htmlentities($html); //O htmlentities é somente para você visualizar no navegador, ele é dispensável
}
}
if (!$encontrou) {
echo 'não foram encontrados elementos';
}
Whether to manipulate/read data from <ConsultarRequest>
you may not need to turn into a string, or need the string for anything, the string itself DOMNode
and DOMXpath
will solve all your problems, for example:
<?php
$xml = '<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ConsultarRequest>
<Cliente>
<sistema>XPTO</sistema>
</Cliente>
<numDDD>xx</numDDD>
<numTerminal>xxxxxxxx</numTerminal>
</ConsultarRequest>
</soapenv:Body>
</soapenv:Envelope>';
$encontrou = false;
$doc = new DOMDocument;
$doc->loadxml($xml);
$xpath = new DOMXpath($doc);
$sistema = $xpath->query("//ConsultarRequest/Cliente/sistema");
$ddd = $xpath->query("//ConsultarRequest/numDDD");
$terminal = $xpath->query("//ConsultarRequest/numTerminal");
echo 'Sistema: ', $sistema[0]->nodeValue, '<br>';
echo 'ddd: ', $ddd[0]->nodeValue, '<br>';
echo 'Terminal: ', $terminal[0]->nodeValue, '<hr>';
The code I posted uses Domxpath and Domxpath can be easily adapted to pick up any tag or variation from it.
– Guilherme Nascimento