Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Podmiana liczby
Forum PHP.pl > Forum > PHP
markonix
  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..
BaN
Powinieneś zastosować preg_replace_callback, drugi przykład
markonix
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?
abort
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 smile.gif
markonix
Nie, to nie data 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ć wink.gif
BaN
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 smile.gif
markonix
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.
Uriziel01
Najprostszy przykład jaki dało rade zrobić. Proszę serdecznie 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. ?>
markonix
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...
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.