Autor Zpráva
WMPopi
Profil
Ahoj,
pracuju s xml feedem produktů pomocí simplexml a potřeboval bych dosáhnout toho, aby skriptu bylo jedno, jestli je uvedena značka <PRODUCT> nebo <product>. Co jsem tak hledal, tak simplexml nejspíš nemá žádný case insensitive mód. Ale např. do zboží.cz jim to posíláme pokaždé jinak (velké/malé) a projde to, takže to nějak ošetřené mít musí.

Napadlo mě několik způsobů:
$xml = "<PRODUCT>Produkt</PRODUCT>";
$xml = preg_replace("#<([^>]*?)>#", "<".strtolower("$1").">", $xml);
echo $xml;

1/ Toto mi nefunguje, zajímalo by mě proč

$xml = "<PRODUCT>Produkt</PRODUCT>";
preg_match_all("#<([^>]*?)>#", $xml, $matches); // načtu všechny výsledky názvů elementů
foreach ($matches[0] as $i => $match) {
  $replace[$i] = strtolower($match); // v cyklu si je převedenu na lowercase
}
$xml = str_replace($matches[0], $replace, $xml); // nahradím výsledky zmenšeninami
echo $xml;

2/ Toto pracuje přesně jak jsem si představoval, možná že na to jdu ale dost krkolomně. Ovšem při větším počtu produktů narážím na velmi dlouhé zpracování, protože preg_match_all mi uloží seznam všech výskytů, mám tedy v poli 1000x <PRODUCT>. Pokud ale vynechám _all a použiju jen preg_match, tak

$xml = "<PRODUCT><TEST>Produkt</TEST></PRODUCT><PRODUCT><TEST>Produkt</TEST></PRODUCT>";
preg_match("#<([^>]*?)>#", $xml, $matches);
print_r($matches);

vypíše pouze

Array
(
    [0] => <PRODUCT>
    [1] => PRODUCT
)

Takže už nevím jak na to. Udělal jsem si jednoduché řešení, které je ale závislé na tom, abych vyjmenoval všechny elementy; což se mi pochopitelně nelíbí..

$tags = array("SHOP", "SHOPITEM", "PRODUCT", "DESCRIPTION", "PRICE_VAT", "DELIVERY_DATE", "URL", "IMGURL", "CATEGORYTEXT", "MANUFACTURER");
foreach ($tags as $tag) {
  $xml = str_replace("<$tag>", "<".strtolower($tag).">", $xml);
  $xml = str_replace("</$tag>", "</".strtolower($tag).">", $xml);
}
DoubleThink
Profil *
WMPopi:
preg_replace("#<([^>]*?)>#", "<".strtolower("$1").">", $xml);
Tohle je nesmysl. Aby to fungovalo, musel bys použít nějaký callback nebo mód eval.
Mimo to je to dost humpolácký postup. Co atributy nebo jmenné prostory? Ty to semele taky.
Keeehi
Profil
WMPopi:
To podstatné už napsal DoubleThink. Jinak zboží.cz na to může jít úplně jinak. Jak víš, že používají simplexml?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: