#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. Пожалуйста, взгляните на мое редактирование и демо сейчас, надеюсь, это не заменит пробелы внутри содержимого