Преобразование XML-вывода с более чем одной обратной ссылкой в ​​строке без тегов xml только с preg_match_all - PullRequest
0 голосов
/ 04 октября 2019

мы получили XML-вывод, подобный этому:

      <phone>
        <countryCode>+45</countryCode>
        <areaCode>354</areaCode>
        <subscriberNumber>1631616</subscriberNumber>
      </phone>

Как я могу преобразовать это в строку, разделенную пробелами: +45 354 1631616 с preg_match_all в результате?

У меня есть приложение, которое может использовать только preg_match_all (из-за некоторых других зависимостей).

Я попробовал следующее:

/\<phone\>\s+\<\D+\>(\+\d+)\<\/\D+\>\s+\<\D+\>(\d+)\<\/\D+\>\s+\<\D+\>(\d+)\<\/\D+\>\s+\<\/phone\>/i

Это дает 3 результата:

Group 1: +45
Group 2: 354
Group 3: 1631616

из-за 3 скобок '()' (я думаю, что мы говорим о обратных ссылках?).

Но мне нужен результат только одной группы

Group 1: +45 354 1631616

, разделенной пробелами. Возможно ли это с preg_match_all (не preg_replace)? Если это невозможно с пробелами, это тоже нормально.

Спасибо за ваши мысли.

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Вы спрашиваете, как настроить конкретное программное обеспечение. Просто не говоря нам, какой. Это не вопрос программирования (PHP).

Разница между preg_match() и preg_match_all() заключается в том, что первое возвращает только одно совпадение, а другое возвращает все совпадения. Матч включает в себя полное совпадение и все захваченные группы.

Если я правильно понимаю, вы хотели бы объединить несколько захваченных групп в один строковый результат. Это очень легко с PHP, но не возможно с соответствием RegEx.

Вот пример PHP:

$data = <<<'XML'
<phone>
  <countryCode>+45</countryCode>
  <areaCode>354</areaCode>
  <subscriberNumber>1631616</subscriberNumber>
</phone>
XML;

$pattern = <<<'PATTERN'
(<phone>\s*<\D+>(\+\d+)<\/\D+>\s*<\D+>(\d+)<\/\D+>\s*<\D+>(\d+)<\/\D+>\s*<\/phone>)
PATTERN;

preg_match($pattern, $data, $match);
$result = $match[1].' '.$match[2].' '.$match[3];
var_dump($result);

Вывод:

string(15) "+45 354 1631616"

В заменеэто будет часть строки замены, а не шаблон:

var_dump(preg_replace($pattern, '$1 $2 $3', $data));

Интересный факт: Xpath имеет некоторые функции агрегирования, поэтому это было бы возможно с выражением:

$document = new DOMDocument();
$document->loadXml($data);
$xpath = new DOMXpath($document);

var_dump(
  $xpath->evaluate(
    'concat(/phone/countryCode, " ", /phone/areaCode, " ", /phone/subscriberNumber)'
  )
);

Вывод:

string(15) "+45 354 1631616"
0 голосов
/ 04 октября 2019

С помощью preg_match() или preg_match_all() вы не можете создать соответствующую группу, которая содержит только номер телефона. Я думаю, что лучшее решение - это то, что вы уже написали, с тремя отдельными группами.
Но если у вас уже есть блок <phone>, вы можете использовать функцию strip_tags(), и тогда вы получите толькономер телефона (и пробельные символы между тегами, если они есть).

...