Wyszukiwanie podciagu liczb w łańcuchu znaków

Wyszukiwanie podciagu liczb w łańcuchu znaków
DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 34
0

Witam,

jak w temacie chciałbym wyselekcjonować ciąg liczb. Problem w tym że w ciągu są również inne niż cyfry znaki a litery rzutowane na typ (int) są równe 0 więc nie moge tego zrobić pętlą po łańcuchu i instrukcją warunkową if($tekst[$i] >= 0 && $tekst[$i]<= 9) dlatego że każdą litere odczyta mi za 0.

Przenosząc to na realia chciałbym wyciągnąć kod, 8 elementowy z Tematu maile którym dostaje raport z webservicu(to tylko przykład). Nie mniej jednak na pewno w tym ciągu będą litery. 1) Czy da się to zrobić? 2) Czy trzeba to robić wyrażeniami regularnymi? Nie widziałem żadnych funkcji które pozwalają na pominięcie liter, no chyba że wyrażenia regularne. Czy ktoś kojarzy co powinienem wygooglować po za wyrażeniami regularnymi?

Dzięki wielkie za podpowiedzi!

MasterOf
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 466
2
Kopiuj
$foo = preg_replace('/[^0-9]/', '', '4gh5hs6hh7');
echo $foo;  //4567
cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9218
2

Rozbijasz sobie string na poszczególne znaki, a potem korzystasz z https://www.php.net/manual/en/function.is-numeric.php
Albo (jak napisał @MasterOf) korzystasz z regex'ów.

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 34
0

OK, dzięki wielkie!

  • Rejestracja: dni
  • Ostatnio: dni
1

$tekst[$i] >= 0 && $tekst[$i] <= 9 wystarczyło zmienić na $tekst[$i] >= '0' && $tekst[$i] <= '9'.

Also,

Kopiuj
function digits_masterof(string $string): string
{
    return preg_replace('/[^0-9]/', '', $string);
}

function digits_mozg(string $string): string
{
    return preg_replace('/\D+/', '', $string);
}

hrtime 100 iteracji, min of 5:

Kopiuj
> head -c 4096 /dev/urandom | php test.php
14358176 digits_masterof
 1295947 digits_mozg
> tr -c -d [:alnum:] </dev/urandom | head -c 4096 | php test.php
13349131 digits_masterof
 3303469 digits_mozg
> 
Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10307
0

Mógłbyś też wykorzystać bibliotekę T-Regx:

Kopiuj
pattern('\D+')->remove('4gh5hs6hh7')->all();

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.