Próbuję stworzyć konwerter, który z kodu zrobi mi zapytanie do bazy MySQL.
Mam przykładowo taki kod:
Kod
<string>
<id>290874</id>
<name>STR_BNAS_DiseaseSATKTALong_Liquid</name>
<body>Seriously Contaminated Bite</body>
</string>
<string>
<id>290880</id>
<name>STR_NAS_Poison_DF3SlimeSlave1</name>
<body>Threatening Infection</body>
</string>
<string>
<id>290875</id>
<name>STR_BNAS_DiseaseSATKTALong_Liquid_Abnormal</name>
<body>Diseased. Cannot be healed by magic or potions.</body>
</string>
<string>
<id>290884</id>
<name>STR_NAS_Poison_DF3SlimeSlave2_Abnormal</name>
<body>Seriously poisoned.</body>
</string>
<string>
<id>290876</id>
<name>STR_BNAS_DiseaseSATKTALong_Liquid_DESC</name>
<body>Long-distance ranged disease kill with water type FX.</body>
</string>
<id>290874</id>
<name>STR_BNAS_DiseaseSATKTALong_Liquid</name>
<body>Seriously Contaminated Bite</body>
</string>
<string>
<id>290880</id>
<name>STR_NAS_Poison_DF3SlimeSlave1</name>
<body>Threatening Infection</body>
</string>
<string>
<id>290875</id>
<name>STR_BNAS_DiseaseSATKTALong_Liquid_Abnormal</name>
<body>Diseased. Cannot be healed by magic or potions.</body>
</string>
<string>
<id>290884</id>
<name>STR_NAS_Poison_DF3SlimeSlave2_Abnormal</name>
<body>Seriously poisoned.</body>
</string>
<string>
<id>290876</id>
<name>STR_BNAS_DiseaseSATKTALong_Liquid_DESC</name>
<body>Long-distance ranged disease kill with water type FX.</body>
</string>
Jakiego wzoru użyć dla funkcji preg_replace, by wyłowić z kodu całe sekcje (od <string> do </string>) zawierające taki sam początek w <name></name>, różniące się końcówką, nie usuwając przy okazji innych.
Jak na razie napisałem trzy linijki usuwające niepotrzebne rzeczy z kodu:
$na_co = "";
Po przepuszczeniu przez taki "filtr" otrzymam coś takiego:
Kod
<id>290874</id><name>STR_BNAS_DiseaseSATKTALong_Liquid</name><body>Seriously Contaminated Bite</body><id>290880</id><name>STR_NAS_Poison_DF3SlimeSlave1</name><body>Threatening Infection</body><id>290875</id><name>STR_BNAS_DiseaseSATKTALong_Liquid_Abnormal</name><body>Diseased. Cannot be healed by magic or potions.</body><id>290884</id><name>STR_NAS_Poison_DF3SlimeSlave2_Abnormal</name><body>Seriously poisoned.</body><id>290876</id><name>STR_BNAS_DiseaseSATKTALong_Liquid_DESC</name><body>Long-distance ranged disease kill with water type FX.</body>
Jak na razie jest dobrze. Teraz chciałbym, aby obok siebie znalazły się wpisy z tym samym początkiem "name", czyli powyższy przykład wyglądałby tak:
Kod
<id>290874</id><name>STR_BNAS_DiseaseSATKTALong_Liquid</name><body>Seriously Contaminated Bite</body><id>290875</id><name>STR_BNAS_DiseaseSATKTALong_Liquid_Abnormal</name><body>Diseased. Cannot be healed by magic or potions.</body><id>290876</id><name>STR_BNAS_DiseaseSATKTALong_Liquid_DESC</name><body>Long-distance ranged disease kill with water type FX.</body><id>290880</id><name>STR_NAS_Poison_DF3SlimeSlave1</name><body>Threatening Infection</body><id>290884</id><name>STR_NAS_Poison_DF3SlimeSlave2_Abnormal</name><body>Seriously poisoned.</body>
Dodatkowo, sekcja z DESC powinna być przed Abnormal, czyli druga i trzecia sekcja powinny być zamienione miejscami. Problem w tym, że nie wiadomo w jakiej kolejności one występują (nieraz Abnormal jest zupełnie przed tym bez końcówki, nieraz za. To samo tyczy się DESC).
Następnie chciałbym, aby z uporządkowanego kodu utworzyć zapytanie do bazy danych, które wstawiałoby wszystko po kolei do jednej tabeli w takiej formie:
INSERT INTO sl_skille (`id_z_gry`, `id_z_gry_desc`, `id_z_gry_abnormal`, `name`, `nazwa`, `opis`) VALUES (id_bez_koncowki, id_desc, id_abnormal, name_bez_koncowki, body_bez_koncowki, body_desc."=====".body_abnormal), (id_bez_koncowki, id_desc, id_abnormal, name_bez_koncowki, body_bez_koncowki, body_desc."=====".body_abnormal), (...), (...);
Chodzi o to, aby wsadzić odpowiednie dane do odpowiednich komórek i połączyć DESC i Abnormal w jedno, oddzielając je pięcioma znakami równości (ot tak, żeby łatwo można było je oddzielić).
Być może poradziłbym sobie sam, jednak nie wiem, jak zmusić kompilator do wyszukania name bez końcówki, np. tak:
Kod
<name>([^\<_DESC_Abnormal]?)</name>
Problem w tym, że w tekst w nawiasach kwadratowych traktowany jest jako osobne litery, więc odrzuci także te, które nie mają końcówki, a zawierają podane litery.