Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zmiana eregi na preg_match
Forum PHP.pl > Forum > Przedszkole
DannyM
Mam cos takiego :
  1. *if (eregi("<trans>.*<pos_id>([0-9]*)</pos_id>.*<session_id>(.*)</session_id>.*<order_id>(.*)</order_id>.*</trans>", $response, $parts)) $result = getme($parts);


i zmienilem na

  1. if (preg_match('<trans>.*<pos_id>([0-9]*)</pos_id>.*<session_id>(.*)</session_id>.*<order_id>(.*)</order_id>.*</trans>', $response, $parts)) $result = getme($parts);


otrzymuje blad

PHP Warning: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Unknown modifier '.'

Moze mi ktos pomoc?
nospor
Całe wyrażenie w preg_match, należy czymś objąć, np ## czyli
preg_match('#twoje wyrazenie#')
DannyM
Mam jeszcze jedna zagwozdke. Wczesniej wyciagalem sobie czesci uzywajac np.
  1. $parts[7]


a teraz nie idzie. Czy musze inaczej je wyciagac?
Lorum3
  1. print_r( $parts);
DannyM
Walcze z tym i mnie wkurza
Ktora wersja bedzie prawidlowa?

  1. if (preg_match('/<trans>\.*<id>([0-9]*)</id>\.*<session>(\.*)</session>([a-z0-9]*)<order_id>(\.*)</order_id>\.*</trans>/', $response, $parts));
  2. if (preg_match('/<trans>.*<id>([0-9]*)<\/id>.*<session>(.*)<\/session>([a-z0-9]*)<order_id>(.*)</order_id>.*<\/trans>/', $response, $parts));
  3. if (preg_match('/<trans>(.*)?<id>([0-9]*)<\/id>(.*)?<session>(.*)?<\/session>([a-z0-9]*)<order_id>(.*)?</order_id>.*<\/trans>/', $response, $parts));
nospor
każde / masz poprzedzić \ A ty jedno pomijasz.
DannyM
Prosze pokaz mi przyklad gdzie pomijam - to co napisalem to z informacji jakie znalazlem w sieci

Jakbardziej prawdziwy wydaje mi sie

'/<trans>(.*)?<id>([0-9]*)<\/id>(.*)?<session>(.*)?<\/session>([a-z0-9]*)<order_id>(.*)?<\/order_id>(.*)?<\/trans>/'
nospor
Cytat
Prosze pokaz mi przyklad gdzie pomijam
Raczysz sobie żartować.... w przykładach wyżej pomijałeś jeden /. Natomiast w poprzednim poście już poprawiłeś ten jeden i do mnie z takim tekstem, ze ci niby kit wciskam. No proszę cie...

Przykład z ostatniego postu wydaje się być ok. Rzuca ci jakieś błędy czy jak?
DannyM
Prosze sie nie denerwowac kolego smile.gif
Zobaczylem ten brakujacy znak i wsyawilem aby upewnic sie czy dobrze mysle. Doceniam twoja prace wiec nie zartuje sobie.
Juz sie boje zapytac ale co tam ... czy te znaki zapytania po (.*)? to dobrze? i czy .* musi byc w nawiasie?
nospor
Cytat
Zobaczylem ten brakujacy znak i wsyawilem aby upewnic sie czy dobrze mysle
No to trzeba było to napisać, że już widzisz. Nie napisałeś tego i wniosek mi mógł nasunąć się tylko jeden.... wink.gif

Cytat
czy te znaki zapytania po (.*)? to dobrze?
Nie. Albo ma być tak: .*? albo tak (.*?)
Cytat
i czy .* musi byc w nawiasie?
Nie musi. Nawias określa grupowanie elementów. Ma to też odwzorowanie w tym co zwraca preg_match
DannyM
Czy jesli zrobie
  1. print_r( $parts);

i mam
Array
(
)

to cos zle zrobilem z ? \/ itd? w preg_match ?
-marek-
a daj sobie echo $parts[1]; itp...

tez mam problem dokładnie z takim samym wyrażeniem, jeśli uda ci się napisać poprawnie to proszę abyś się podzielił
nospor
Skoro $parts zawiera pustą tablicę to tym bardziej $parts[1] nic nie będzie miało.... ty myśliś ze to czary jakieś czy cośquestionmark.gif

@Danny pokaż jak teraz wygląda wyrażenie. Pokaż też na jakim tekście działasz.
-marek-
<response>
<status>OK</status>
<trans>
<id>2323444994</id>
<pos_id>100778</pos_id>
<session_id>6133298</session_id>
<order_id>634-P-S-12</order_id>
<amount>2990</amount>
<status>99</status>
<pay_type>t</pay_type>
<pay_gw_name>pt</pay_gw_name>
<desc>abcd</desc>
<desc2>634</desc2>
<create>2012-03-30 09:34:59</create>
<init>2012-03-30 09:35:01</init>
<sent>2012-03-30 09:35:01</sent>
<recv>2012-03-30 09:35:01</recv>
<cancel></cancel>
<auth_fraud>0</auth_fraud>
<ts>1333235326788</ts>
<sig>554b3517b42424b51d6ecfa37dd73b9</sig> </trans>
</response>
DannyM
Finalnie wyglada to tak:

pobieram je CURL

  1. $response = curl_exec($ch);

dalej
  1. if (preg_match('/<trans>.*?<id>([0-9]*?)<\/id>.*?<session>(.*?)<\/session>.*?<order_id>(.*?)<\/order_id>.*?<amount>([0-9]*?)<\/amount>.*?<status>([0-9]*?)<\/status>.*?<desc>(.*?)<\/desc>.*?<ts>([0-9]*?)<\/ts>.*?<sig>([a-z0-9]*?)<\/sig>.*?<\/trans>/', $response, $parts));
  2.  
  3. print_r( $parts);

Sprawdzalem i dane z xml sa przekazywane i wyswietlaja sie przy uzyciu echo $response

Widze, ze podobnie jak wyzej
nospor
[0-9]*?
Co to jest? Danny, nie strzelaj. Poczytaj co robi *, poczytaj co robi znak zapytania a nie strzelasz

.*? To sytuacja wyjątkowa i tylko ta jedna. Oznacza by brać jak najmniej.
.* - brać jak najwiecej.

W każdym innym przypadku nie można stosować *? razem bo to bezsensu.

Cytat
pobieram je CURL
No i super. A ja chciałbym je zobaczyć.
DannyM
  1. <response>
  2. <status>OK</status>
  3. <trans>
  4. <id>204794807</id>
  5. <session>2ea53c676989920848ead65bcea6</session>
  6. <order_id>7</order_id>
  7. <amount>1850880</amount>
  8. <status>2</status>
  9. <desc>oplata</desc>
  10. <ts>1333094962629</ts>
  11. <sig>b1b018995sdfevwwy03059a076454c44</sig>
  12. </trans>
  13. </response>
nospor
  1. if (preg_match('/<trans>\s*<id>(\d+)<\/id>\s*<session>(.*?)<\/session>\s*<order_id>(.*?)<\/order_id>\s*<amount>(\d+)<\/amount>\s*<status>(\d+)<\/status>\s*<desc>(.*?)<\/desc>\s*<ts>(\d+)<\/ts>\s*<sig>([a-z0-9]*)<\/sig>\s*<\/trans>/', $response, $parts));
  2.  
  3. print_r( $parts);
  4.  
DannyM
Niestety pusto sad.gif
Array
(
)
nospor
A mi działa. Pokaż dokładnie cały kod po zmianach
DannyM
Wkleilem dokladnie to od ciebie

  1. if (preg_match('/<trans>\s*<id>(\d+)<\/id\s*<session>(.*?)<\/session>\s*<order_id>(.*?)<\/order_id>\s*<amount>(\d+)<\/amount>\s*<status>(\d+)<\/status>\s*<desc>(.*?)<\/desc>\s*<ts>(\d+)<\/ts>\s*<sig>([a-z0-9]*)<\/sig>\s*<\/trans>/', $response, $parts))


jeszcze dla zrozumienia zrobilem sobie taki pogladowy szablon
  1. <trans>\s*
  2. <id>(\d+)<\/id>\s*
  3. <session>(.*?)<\/session>\s*
  4. <order_id>(.*?)<\/order_id>\s*
  5. <amount>(\d+)<\/amount>\s*
  6. <status>(\d+)<\/status>\s*
  7. <desc>(.*?)<\/desc>\s*
  8. <ts>(\d+)<\/ts>\s*
  9. <sig>([a-z0-9]*)<\/sig>\s*
  10. <\/trans>
nospor
var_dump($response);
Pokaż dokładnie co to zwraca.

I pokaż cały kod, włącznie z curl.
Wyrażenie jest poprawne dla tekstu co pokazałes. może coś z kolejnoscią kodu masz nie tak
DannyM
  1. $ch = curl_init();
  2. curl_setopt($ch, CURLOPT_URL, "https://" . $server . $script);
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  4. curl_setopt($ch, CURLOPT_HEADER, 0);
  5. curl_setopt($ch, CURLOPT_TIMEOUT, 20);
  6. curl_setopt($ch, CURLOPT_POST, 1);
  7. curl_setopt($ch, CURLOPT_POSTFIELDS, $parameters);
  8. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  9. $response = curl_exec($ch);
  10. curl_close($ch);
  11.  
  12. if (preg_match('/<trans>\s*<id>(\d+)<\/id\s*<session>(.*?)<\/session>\s*<order_id>(.*?)<\/order_id>\s*<amount>(\d+)<\/amount>\s*<status>(\d+)<\/status>\s*<desc>(.*?)<\/desc>\s*<ts>(\d+)<\/ts>\s*<sig>([a-z0-9]*)<\/sig>\s*<\/trans>/', $response, $parts))
  13.  
  14. print_r( $parts);
  15.  


var_dump($response);

  1. string(680) "<?xml version="1.0" encoding="UTF-8"?>
  2. <response>
  3. <status>OK</status>
  4. <trans>
  5. <id>204794807</id>
  6. <session>2ea53c676989920848ead65bcea6</session>
  7. <order_id>7</order_id>
  8. <amount>1850880</amount>
  9. <status>2</status>
  10. <desc>oplata</desc>
  11. <ts>1333094962629</ts>
  12. <sig>b1b018995sdfevwwy03059a076454c44</sig>
  13. </trans>
  14. </response>


Przy uzyciu eregi wszystko dziala bez krecenia ale niestety nie wszystkie serwery to obsluguja chyba dzieki php5.3+
nospor
Mi tam wszystko działa.

Drobna zmiana, może ci pomoże:
  1. if (preg_match('/<trans>\s*<id>(\d+)<\/id>\s*<session>(.*?)<\/session>\s*<order_id>(.*?)<\/order_id>\s*<amount>(\d+)<\/amount>\s*<status>(\d+)<\/status>\s*<desc>(.*?)<\/desc>\s*<ts>(\d+)<\/ts>\s*<sig>([a-z0-9]*)<\/sig>\s*<\/trans>/si', $response, $parts));
  2.  
  3. print_r( $parts);
  4.  
DannyM
Dziekuje Ci bardzo za poswiecony czas. Jak zwykle mozna na Ciebie liczyc.
Wszystko smiga jak trzeba. Masz u mnie piwo aaa cala zgrzewke smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.