Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript]text.match zwraca za dużo
Forum PHP.pl > Forum > Przedszkole
Warmix
Cytat
var str2 = document.getElementById("textarea").value;
str2 = str2.match(/test1(.*?)test2/g);

document.getElementById("p3").innerHTML = str2;


Czemu taki kod zwraca mi wartość:
Cytat
test1 tutaj jakis test test2


Chciałbym, aby zwracał:
Cytat
tutaj jakis test
kapslokk
[JAVASCRIPT] pobierz, plaintext
  1. var str2 = document.getElementById("textarea").value;
  2.  
  3. var regex = /test1(.*?)test2/g;
  4. str2 = regex.exec(str2)
  5.  
  6. document.getElementById("p3").innerHTML = str2[1];
[JAVASCRIPT] pobierz, plaintext
nospor
match zwraca ci tablice z odpowiedziami, dokladnie tak jak preg_match w php. A ze ty potem bez namyslu te tablice rzutujesz na tekst to masz co masz smile.gif
kapslokk
@nospor - też tak myślałem, ale przy wywołaniu np:
[JAVASCRIPT] pobierz, plaintext
  1. var str = "test1 tutaj jakis test test2";
  2. var res = str.match(/test1(.*?)test2/g);
  3. console.log(res);
[JAVASCRIPT] pobierz, plaintext

W konsoli mam string biggrin.gif Dlatego wrzucilem rozwiązanie z .exec.
Pewnie jest tu jakiś śmieszny trik do zrobienia, ale na JS się nie znam biggrin.gif
nospor
@kapslokk wg manuala to zwraca tablice wiec nawet nie sprawdzalem wink.gif
https://developer.mozilla.org/en/docs/Web/J...ts/String/match
kapslokk
Znaczy tak, zwraca tablice, ale z jednym elementem, ktorym jest caly string ktory pasuje do regexa w tym przypadku. Czyli tak jakby w przypadku preg_matcha nie bylo tego nawiasu w srodku. Taki preg_match_all bez nawiasow biggrin.gif
nospor
Wg dokumentacji zwraca tablice z elementami.... Zmuszasz mnie do testow normanie wink.gif
Warmix
@nospor bez problemu mogę wyłuskać wartość, gdy nie daję flagi /g. Wtedy [1] - daje mi ten tekst pomiędzy. Problem jest gdy nadam /g. Wtedy każda wartość podawana jest tylko w formie wraz z tymi test1 i test2. W jaki sposób mogę odwołać się w match() to tych elementów pomiędzy?

@kapslokk poniekąd działa, ale tylko dla jednego elementu, tak, jakby flaga /g nie była zastosowana sad.gif Według tego co piszą, powinno dać się odwołać po kolei [1], [2] do kolejnych znalezionych elementów, ale [0] odwołuje do wraz z test1 i test2, [1] do bez tego a [2] - undefinied sad.gif

Wzór:
Cytat
test1 tutaj jakis test test2
test1 drugi test2
test1 trzeci test2


I zwrócić powinno:
Cytat
tutaj jakis test
drugi
trzeci
nospor
O, z G zwraca jeden element. Wywalimi G i damy I mamy kilka elementow smile.gif
kapslokk
@nospor - Teraz to i sam do tego doszedłem biggrin.gif

@Warmix
.exec wielokrotnie odpalany bedzie zwracal kolejne wyniki:

[JAVASCRIPT] pobierz, plaintext
  1. var str = "test1 111 test2 test1 tutaj jakis test test2 test1 tutaj jakis test test2";
  2. var regex = /test1(.*?)test2/g;
  3. var res;
  4. res = regex.exec(str)
  5. console.log(res)
  6. res = regex.exec(str)
  7. console.log(res)
  8. res = regex.exec(str)
  9. console.log(res)
  10. res = regex.exec(str)
  11. console.log(res)
[JAVASCRIPT] pobierz, plaintext


Mozesz odpalić go w pętli
by_ikar
Regex w JS'ie działa tak, że kiedy nie masz ustawionej flagi g wtedy zwracany jest pierwszy napotkany wynik res[1], kiedy jest ustawiona flaga g wtedy zwracany jest cały wynik, nie tylko końcowa wartość. Działa to tak samo jak preg_match w php, jak już wyżej @nospor napisał.

Twój przypadek nie potrzebuje flagi g, chyba że w twoim przypadku wystąpień jest wiele, to wtedy i tak będziesz musiał iterować po tablicy.
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.