• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyszukiwanie w ciągu pozycji start-index oraz start-end

Object Storage Arubacloud
+2 głosów
103 wizyt
pytanie zadane 2 stycznia 2023 w PHP przez troian1337 Użytkownik (720 p.)

Witam, potrzebuje stworzyć program który będzie szukał w stringu frazy i zwracał jej początkową pozycję oraz końcową. 

fraza jaką potrzebuje znaleźć to liczba znajdująca się między dwoma kwadratowymi nawiasami. [1] [25] [99] [2521]

I tutaj zaczynają się schody bo o ile nie miałem problemu ze znalezieniem tego jeżeli w danym stringu było tylko jedno wystąpienie tego 

preg_match("/\[.{1,5}\]/", $string)

To problem zaczyna się przy większej ilości takich pozycji.

Drugi problem jaki mam to określenie startowego położenia frazy oraz końcowego, gdyż program ma pobierać tą wartość ze stringa i szukać jej w bazie danych, jeżeli znajdzie to podmienia go, jeżeli nie pomija.

I tutaj mam największy problem właśnie z tymi dwiema rzeczami, Jak sprawdzić czy w jednym stringu występuje więcej niż jedno powtórzenie frazy, oraz w jaki sposób określić jej pozycję w stringu.

2 odpowiedzi

+2 głosów
odpowiedź 2 stycznia 2023 przez VBService Ekspert (253,340 p.)
wybrane 3 stycznia 2023 przez troian1337
 
Najlepsza

Nie do końca, chyba rozumiem czego oczekujesz, ale sprawdź np.

[ on-line , on-line ] (najprostszy - "łopatologiczny")

$regexes = [ '/\[\d+\] \[\d+\]/', '/\[\d+\] \[\d+\] \[\d+\]/', '/\[\d+\] \[\d+\] \[\d+\] \[\d+\]/' ];
$string  = 'Witam, potrzebuje stworzyć program który będzie szukał w stringu frazy i zwracał jej początkową pozycję oraz końcową'
         . 'fraza jaką potrzebuje znaleźć [80] [2] to liczba znajdująca się między dwoma kwadratowymi nawiasami. [1] [25] [99] [2521]'
         . 'I tutaj zaczynają się schody bo o ile nie miałem problemu ze znalezieniem tego jeżeli w danym stringu było'
         . 'tylko jedno [99] [534] [1] wystąpienie tego ';

foreach ($regexes as $regex) {
    if (preg_match($regex, $string, $matches)) {
       var_dump($matches);
    } else {
       echo 'Brak';
    }
}

 

lub 

fraza + pozycja frazy: preg_match_all + PREG_OFFSET_CAPTURE

[ on-line ]

$regex = '/\[\d+\]/';

 

1
komentarz 3 stycznia 2023 przez troian1337 Użytkownik (720 p.)
Super 3 opcja robi dokładnie to o co mi chodziło a nawet więcej bo dzięki temu że wrzuca mi to od razu do tabelki to nie będę musiał zbierać powtórzeń i wszystko sobie ładnie za jej pomocą zmapuje :)
+1 głos
odpowiedź 2 stycznia 2023 przez Wiciorny Ekspert (270,150 p.)

Może spróbuj jeszcze z wyszukiwaniem frazy przez strpos(). ?

Funkcja ta zwraca pozycję (indeks) pierwszego wystąpienia szukanej frazy w stringu lub wartość false, jeśli fraza nie została znaleziona.

Przykład kodu, który wyszukuje początkową i końcową pozycję frazy (liczby) w stringu:

$string = "[1] [25] [99] [2521]";

$positions = [];
$start = 0;
while (true) {
  $start = strpos($string, "[", $start);
  if ($start === false) {
    break;
  }
  $end = strpos($string, "]", $start);
  if ($end === false) {
    break;
  }
  $positions[] = [$start, $end];
  $start = $end + 1;
}

var_dump($positions);  // zwraca [[0, 2], [6, 8], [12, 14], [18, 22]]

Natomiast jeśli chcesz to zrobić tak zeby  znaleźć wszystkie wystąpienia frazy, możesz użyć pętli while i w niej wywoływać funkcję strpos() z argumentem $haystack ustawionym na pozycję o 1 większą niż pozycja końca ostatnio znalezionej frazy.

Pamiętaj też, żeby sprawdzić, czy fraza została znaleziona (funkcja strpos() zwraca wartość false jeśli frazy nie ma w stringu).

Np w ten sposób: 

function find_all_phrases($string) {
  $positions = array();
  $start = 0;
  while (($start = strpos($string, "[", $start)) !== false) {
    $end = strpos($string, "]", $start);
    if ($end === false) {
      break;
    }
    $positions[] = array($start, $end);
    $start = $end + 1;
  }
  return $positions;
}

print_r(find_all_phrases("[1] [25] [99] [2521]"));  // zwraca Array ( [0] => Array ( [0] => 0 [1] => 2 ) [1] => Array ( [0] => 4 [1] => 6 ) [2] => Array ( [0] => 8 [1] =>

 

1
komentarz 2 stycznia 2023 przez VBService Ekspert (253,340 p.)
edycja 2 stycznia 2023 przez VBService

smiley nie przepuszcza [] pustych

[ on-line ]

function find_all_phrases($string) {
  $start = 0;
  while (($start = strpos($string, "[", $start)) !== false &&
         ($end = strpos($string, "]", $start)) !== false) {
    if ($end - $start > 1) $positions[] = [$start, $end];
    $start = $end++;
  }
  return $positions;
}
 
print_r(find_all_phrases("[1] [25] [99] [2521] []lorem [2]"));

lub

[ on-line ]

function find_all_phrases($string) {
  $start = 0;
  while (($start = strpos($string, "[", $start)) !== false &&
         ($end = strpos($string, "]", $start)) !== false) {
    if (trim(substr($string, $start + 1, ($end - $start) - 1)) != null) $positions[] = [$start, $end];
    $start = $end++;
  }
  return $positions;
}
 
print_r(find_all_phrases("[1] [25] [99] [2521] [ ]lorem [][2] [    ]  [55]"));

 

1
komentarz 2 stycznia 2023 przez Wiciorny Ekspert (270,150 p.)
nie było wzmianki o pustych, ale może się przydać. Dzięki

Podobne pytania

0 głosów
2 odpowiedzi 6,912 wizyt
+1 głos
0 odpowiedzi 288 wizyt
0 głosów
1 odpowiedź 153 wizyt
pytanie zadane 15 grudnia 2016 w C i C++ przez Jan Dobrakowski Użytkownik (580 p.)

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...