Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: JS/Jquery: Jak wyciągnąć ciąg znaków z pomiędzy dwóch innych ciągów?
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
shimano
Witam,

Pewnie niektórzy pomyślą sobie, że upierdliwy jestem i pokłóciłem się z Google. Otóż, może pierwsze, ale nie drugie. Póki co nie znalazłem odpowiedzi.

A pytanie, jak w temacie. W PHP korzystam z podpowiedzi, jakiej udzielił mi już ktoś wcześniej na tym forum, czyli #ciag1(.*?)ciag2#, przy czym jako zwrot mogę dostać to co w nawiasie lub TRUE i cały ciąg spomiędzy #. Teraz w JS/Jquery potrzebuję dokładnie tylko i wyłącznie tego co byłoby pomiędzy ciag1 i ciag2.

Póki co chyba najbliższe rozwiązaniu co wymyśliłem to:
Kod
var ciag = "abcdefghij";
alert(ciag.match("abc(.*?)hij");


Ale oczywiście mi nie działa;/ Tzn. działa, ale nie do końca, ponieważ zwraca:
Kod
abcdefghij,defg

A powinno tylko to, co jest po przecinku.

Czy może ktoś pomóc?
kamil4u
Najprościej:
Kod
<script type="text/javascript">
var ciag = "abcdefghij";
alert(ciag.match("abc(.*?)hij")[1]);
</script>
shimano
Genialne.

Tylko zastanawiam się na ile to jest poprawne składniowo? Można w JS tak dodawac [] po funkcji?

P.S.
Jeszcze tylko takie szybkie pytanie - Jak pobrać ilość znalezionych ciągów?
kamil4u
Chodzi o to, że w wyniku dostałeś tablicę składającą się z 2 elementów. Jak wiadomo numeracja odbywa się od 0(stąd jedynka), natomiast skoro zwraca Ci tablicę to możesz w każdej chwili pobrać jej 2 element poprzez dodanie [1];

To tak jak być zrobił tak:
Kod
function x(){ return [0,1]; } //zwraca tablicę
alert( x()[1] );//zwraca 2 element z tablicy, którą zwróciła funkcja x, czyli 1
shimano
Cytat(kamil4u @ 23.04.2010, 20:21:45 ) *
Chodzi o to, że w wyniku dostałeś tablicę składającą się z 2 elementów. Jak wiadomo numeracja odbywa się od 0(stąd jedynka), natomiast skoro zwraca Ci tablicę to możesz w każdej chwili pobrać jej 2 element poprzez dodanie [1];

To tak jak być zrobił tak:
Kod
function x(){ return [0,1]; } //zwraca tablicę
alert( x()[1] );//zwraca 2 element z tablicy, którą zwróciła funkcja x, czyli 1


Już rozumiem. Nigdy nie domyśliłbym się, że wynik mam w tablicy ;/


To w takim razie, pytanie - dlaczego nie działa mi to (te wyrażenie regularne) w postaci zwielokrotnionej?

Np.
Cytat
var ciag = "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij";
var znalezione = ciag.match("abc(.*?)hij");
alert(znalezione.length); // tutaj wyswietli tylko 2, zamiast 10;/ dlaczego?

kamil4u
Poczytaj o wyrażeniach regularnych - szczególnie o "fladze g" - polecam: http://www.egrafik.pl/kurs-regex-wyrazenia-regularne/
shimano
Cytat(kamil4u @ 23.04.2010, 20:32:30 ) *
Poczytaj o wyrażeniach regularnych - szczególnie o "fladze g" - polecam: http://www.egrafik.pl/kurs-regex-wyrazenia-regularne/


Znam stronę. Jednakże "abc(.*?)hij/g", ani "abc/g(.*?)hij/g" mi "nie łapie". Naprawdę, wiele razy brałem się za regexy i chyba tak jak pewne dziedziny matematyki - nigdy nie pojmę ;/

Update:
CHYBA znalazłem rozwiązanie. Moim błędem było zamieszczenie wyrażenia w cudzysłowiu. Po zlikwidowaniu go chyba działa poprawnie.

Kod
var znalezione = ciag.match(/abc(.*?)hij/g);

kamil4u
Nie działa poprawnie, bo zwraca nie to co trzeba... - bardzo dawno się bawiłem w wyrażenia, dlatego pewnie to co jest poniżej da się zrobić lepiej, ale już mi się nie chce myśleć:
Kod
var ciag = "abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij";
var test = ciag.match( /abc(.*?)hij/g );
var wynik = [];
for(var i=0; j=test[i++];){
wynik[wynik.length || 0] = j.match( /abc(.*?)hij/)[1];
}
alert(wynik);
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.