Как удалить пробелы внутри XML-тега, закрывающий тег и пробелы между тегами

#php #regex #xml

#php #регулярное выражение #xml

Вопрос:

У меня возникли трудности с удалением пробелов между открывающими и закрывающими тегами XML, а также между тегами. Как вы можете видеть из предоставленного XML-кода, внутри тега < priip> и нескольких других есть пробелы, в то время как закрывающий тег for также содержит пробелы < /properties>

Я попробовал несколько модификаций preg_replace (), trim (), но, похоже, не могу заставить это работать должным образом. Я понимаю, что обычно следует отклонять недопустимый XML, а не пытаться это исправить, но я должен это исправить.

XML

 < priip> 
< data> 
< product> 
< priipCloudProductTemplate>otc</priipCloudProductTemplate> 
< priipCloudProductType>fxSwap</priipCloudProductType> 
< productIdentifier>RBI_fxSwap_EURUSD_long_1Y2D_EUR</productIdentifier> < /product> 
< document> 
< type>final</type> 
< /document> 
< properties> 
< includeEarlyRedemptionInExtraordinaryEventsAlert>true</includeEarlyRedemptionInExtraordinaryEventsAlert> 
< /properties> 
< tradeDate>2018-01-18</tradeDate> 
< effectiveDate>2018-01-20</effectiveDate> 
< fxSwap> 
<holder>client</holder> 
 <currencyPair>EURUSD</currencyPair> 
 <notionalAmount>1000000</notionalAmount> 
 <notionalAmountCurrency>EUR</notionalAmountCurrency> 
 <terminationDate>2019-01-20</terminationDate> 
 <forwardRate> 
 <value>1.25620</value> 
 </forwardRate> .......
  

Я ожидаю, что на выходе не будет ненужных пробелов

Вывод XML

 <priip> 
<data> 
<product> 
<priipCloudProductTemplate>otc</priipCloudProductTemplate> 
<priipCloudProductType>fxSwap</priipCloudProductType> 
<productIdentifier>RBI_fxSwap_EURUSD_long_1Y2D_EUR</productIdentifier></product> 
<document> 
<type>final</type> 
</document> 
<properties> <includeEarlyRedemptionInExtraordinaryEventsAlert>true</includeEarlyRedemptionInExtraordinaryEventsAlert> 
</properties> 
<tradeDate>2018-01-18</tradeDate> 
<effectiveDate>2018-01-20</effectiveDate> 
<fxSwap> 
<holder>client</holder> 
<currencyPair>EURUSD</currencyPair> 
<notionalAmount>1000000</notionalAmount> 
<notionalAmountCurrency>EUR</notionalAmountCurrency> 
<terminationDate>2019-01-20</terminationDate> 
<forwardRate> 
<value>1.25620</value> 
</forwardRate> ......
  

Ответ №1:

Может быть, что-то вроде этого…

 $xml = '< priip>
< data>
< product>
< priipCloudProductTemplate>otc</priipCloudProductTemplate>
< priipCloudProductType>fxSwap</priipCloudProductType>
< productIdentifier>RBI_fxSwap_EURUSD_long_1Y2D_EUR</productIdentifier> < /product>
< document>
< type>final</type>
< /document>
< properties>
< includeEarlyRedemptionInExtraordinaryEventsAlert>true</includeEarlyRedemptionInExtraordinaryEventsAlert>
< /properties>
< tradeDate>2018-01-18</tradeDate>
< effectiveDate>2018-01-20</effectiveDate>
< fxSwap>
<holder>client</holder>
 <currencyPair>EURUSD</currencyPair>
 <notionalAmount>1000000</notionalAmount>
 <notionalAmountCurrency>EUR</notionalAmountCurrency>
 <terminationDate>2019-01-20</terminationDate>
 <forwardRate>
 <value>1.25620</value>
 </forwardRate>';

echo preg_replace('/(<)s(/?(?:[A-Z][A-Zd]*)b[^>]*>)/i', '$1$2', $xml);

/*
 * Will produce...

<priip>
<data>
<product>
<priipCloudProductTemplate>otc</priipCloudProductTemplate>
<priipCloudProductType>fxSwap</priipCloudProductType>
<productIdentifier>RBI_fxSwap_EURUSD_long_1Y2D_EUR</productIdentifier> </product>
<document>
<type>final</type>
</document>
<properties>
<includeEarlyRedemptionInExtraordinaryEventsAlert>true</includeEarlyRedemptionInExtraordinaryEventsAlert>
</properties>
<tradeDate>2018-01-18</tradeDate>
<effectiveDate>2018-01-20</effectiveDate>
<fxSwap>
<holder>client</holder>
 <currencyPair>EURUSD</currencyPair>
 <notionalAmount>1000000</notionalAmount>
 <notionalAmountCurrency>EUR</notionalAmountCurrency>
 <terminationDate>2019-01-20</terminationDate>
 <forwardRate>
 <value>1.25620</value>
 </forwardRate>
*/
  

Будет работать даже с тегами, которые содержат такие атрибуты, как < tag arg="val"> , а другое решение не будет, к сожалению, я не могу прокомментировать его ответ из-за моей низкой репутации…

Комментарии:

1. Большое вам спасибо, это помогло и сработало так, как хотелось.

Ответ №2:

Я думаю, это может вам помочь.

 <?php

    $xml = <<<XML

    < priip> 
    < data> 
    < product> 
    < priipCloudProductTemplate>otc</priipCloudProductTemplate> 
    < priipCloudProductType>fxSwap</priipCloudProductType> 
    < productIdentifier>RBI_fxSwap_EURUSD_long_1Y2D_EUR</productIdentifier> < /product> 
    < document> 
    < type>final</type> 
    < /document> 
    < properties> 
    < includeEarlyRedemptionInExtraordinaryEventsAlert>true</includeEarlyRedemptionInExtraordinaryEventsAlert> 
    < /properties> 
    < tradeDate>2018-01-18</tradeDate> 
    < effectiveDate>2018-01-20</effectiveDate> 
    < fxSwap> 
    <holder>client</holder> 
     <currencyPair>EURUSD</currencyPair> 
     <notionalAmount>1000000</notionalAmount> 
     <notionalAmountCurrency>EUR</notionalAmountCurrency> 
     <terminationDate>2019-01-20</terminationDate> 
     <forwardRate> 
     <value>1.25620</value> 
     </forwardRate> .......


    XML;

    $x = preg_replace('/(<)(s )/?(w >)/m', "$1$3", $xml);

    echo $x;


    ?>
  

Вернуть XML

 <priip> 
<data> 
<product> 
<priipCloudProductTemplate>otc</priipCloudProductTemplate> 
<priipCloudProductType>fxSwap</priipCloudProductType> 
<productIdentifier>RBI_fxSwap_EURUSD_long_1Y2D_EUR</productIdentifier> <product> 
<document> 
<type>final</type> 
<document> 
<properties> 
<includeEarlyRedemptionInExtraordinaryEventsAlert>true</includeEarlyRedemptionInExtraordinaryEventsAlert> 
<properties> 
<tradeDate>2018-01-18</tradeDate> 
<effectiveDate>2018-01-20</effectiveDate> 
<fxSwap> 
<holder>client</holder> 
 <currencyPair>EURUSD</currencyPair> 
 <notionalAmount>1000000</notionalAmount> 
 <notionalAmountCurrency>EUR</notionalAmountCurrency> 
 <terminationDate>2019-01-20</terminationDate> 
 <forwardRate> 
 <value>1.25620</value> 
 </forwardRate> .......
  

Ответ №3:

Вы можете сделать это с помощью простого php str_replace() с сопоставлением массива, чтобы удалить >space с > и <space с <

 $expected_xml = str_replace(['< ','> '],['<','>'],$xml);
echo $expected_xml;
  

ДЕМО: https://3v4l.org/Jq5Mi

Комментарии:

1. Это заменит все пробелы — они могут быть в содержимом!

2. таким образом, значения также будут повреждены.

3. @NigelRen Да, теперь понял. спасибо 🙂

4. Пожалуйста, взгляните на мое редактирование и демо сейчас, надеюсь, это не заменит пробелы внутри содержимого