Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Podmiana liczby, preg_replace
markonix
post
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


  1. /^STRING (\d*)\/12\/2012/

array (
0 => 'STRING 7/12/2012',
1 => '7',
)

Wyciągnięcie liczby nie sprawia mi problemu ale potem chciałbym stworzyć nowy string z liczbą +1.
Pomijając czy w preg_replace można zrobić małe dodawanie to po prostu chciałbym daną liczbę (całkowitą) podmienić na nową.

Liczyłem, że wystarczy ten sam regexp bo jest generowany dynamicznie ale niestety tak prosto nie jest.
  1. $count = null;
  2. $returnValue = preg_replace('/^STRING (\d*)\/12\/2012/', '8', 'STRING 7/12/2012', -1, $count);

Niestety to mi podmienia cały string na "8" co oczywiście mnie nie dziwi ale jak podmienić tylko tamtą liczbę?
Wyrażenia regularne to nie jest jakaś moja mocna strona..

Ten post edytował markonix 24.09.2012, 22:52:12
Go to the top of the page
+Quote Post
BaN
post
Post #2





Grupa: Zarejestrowani
Postów: 158
Pomógł: 43
Dołączył: 9.11.2007

Ostrzeżenie: (0%)
-----


Powinieneś zastosować preg_replace_callback, drugi przykład
Go to the top of the page
+Quote Post
markonix
post
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Kwestia tego dodania +1 jest dla mnie drugorzędna i budowanie tego w funkcje średnio mi to wygląda.

No ale choćby dla treningu coś tam stworzyłem.
  1. $text = 'STRING 1/1/2012';
  2. function add($matches) {
  3. return $matches[1] . ($matches[2]+1) . $matches[3];
  4. }
  5. echo preg_replace_callback('/(STRING )(\d*)(\/1\/2012)/', 'add_one', $text);

Działa tylko czy to jedyny sposób, głównie chodzi o dynamiczne tworzenie regexp'a, tutaj muszę po prostu podzielić string na to co jest przed szukanym elementem i po nim - może da się odwrotnie?

Ten post edytował markonix 24.09.2012, 22:09:46
Go to the top of the page
+Quote Post
abort
post
Post #4





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

Ostrzeżenie: (0%)
-----


Cytat(markonix @ 24.09.2012, 22:28:57 ) *
Wyciągnięcie liczby nie sprawia mi problemu ale potem chciałbym stworzyć nowy string z liczbą +1.

Może ja jestem głupi, ale... string wygląda mi na DATĘ (nie wiem, czy format d/m/y, czy anglosaski m/d/y). Co będzie, jak gdzieś dostaniesz w dacie ostatni dzień miesiąca albo ostatni miesiąc roku? Naprawdę będziesz się posługiwał gdzieś w kodzie 32gim dniem miesiąca lub 13tym miesiącem w roku?
Do operacji na datach są odpowiednie funkcje: http://php.net/manual/en/ref.datetime.php
No chyba że w jakiś sposób zapewnisz sobie, że nie nie dostaniesz nigdy do obrobienia daty na przykład 31 grudnia (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
markonix
post
Post #5





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Nie, to nie data (IMG:style_emoticons/default/wink.gif) To numery faktury i po prostu chce zrobić kolejny numer faktury na podstawie formatu serii.
Z formatu tworzę regxp'a, który fajnie mi wyłapuje numer faktury gdziekolwiek on się znajdzie i bez względu czy w formacie jest miesiąc i rok, teraz go tylko zwiększyć o jeden i będę mógł iść spać (IMG:style_emoticons/default/wink.gif)

Ten post edytował markonix 24.09.2012, 22:35:48
Go to the top of the page
+Quote Post
BaN
post
Post #6





Grupa: Zarejestrowani
Postów: 158
Pomógł: 43
Dołączył: 9.11.2007

Ostrzeżenie: (0%)
-----


Co do tego czy wyrażenie regularne jest odpowiednie w tym wypadku, to pewnie nie, można się pobawić w obliczanie pozycji i wyciąganie odpowiednich ciągów z napisu albo też zastosować sscanf, chyba będzie najprościej:
  1. $result = sscanf('STRING 12/1/2012', '%s%d%s');
  2. var_dump($result);


To idź spać, dobranoc (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
markonix
post
Post #7





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


sscanf niezbyt - jak ktoś sobie wymyśli format "FVAT [miesiac]/[numer] to szybko się to rozleci, a preg_ się nie wysypie bo jego format jest mocno sztywny i konkretny, że to tak określę.. Generuje go dynamicznie na podstawie wzorca użytkownika i zmieniam miesiąc, rok na aktualne.

Kurdę.. mój problem nie wydaję się tak trudny - po prostu chcę podmienić szukany fragment stringa..
gdy analogiczne wyciąganie stringa preg_matchem działa bezproblemowo.

Wyciągnięcie -> edycja = cały mój problem.

Ten post edytował markonix 24.09.2012, 22:50:09
Go to the top of the page
+Quote Post
Uriziel01
post
Post #8





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


Najprostszy przykład jaki dało rade zrobić. Proszę serdecznie (IMG:style_emoticons/default/smile.gif)
  1. <?PHP
  2. $old = 'STRING 7/12/2011';
  3. $new = preg_replace("|(.+)(\d+)/(\d+)/(\d+)|e", '"$1" . ("$2" + 1) . "/" . $3 . "/" . $4', $old);
  4. var_dump($new);
  5. ?>
Go to the top of the page
+Quote Post
markonix
post
Post #9





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


Dzięki, mniej więcej też z preg_replace sobie poradziłem ale ostatecznie podszedłem do tego z drugiej strony - zamiast podmieniać numer w starym numerze faktury utworzyłem nowy string na podstawie wzorca. Szkoda, że na taką oczywistość wpadłem po kilku godzinach...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 7.10.2025 - 16:17