dapatkan string di antara dua string menggunakan jquery

Jika saya memiliki HTML ini

<div class="comment-body">
[img]http://topnews.net.nz/images/YouTube-3.jpg[/img] random text here
</div>

<div class="comment-body">
[img]http://blog.brightcove.com/sites/all/uploads/FACEBOOK%20ICON.png[/img] random text here
</div>

bagaimana menggunakan jquery saya dapat mengekstrak nilai antara [img] dan [/img] dan menetapkannya sebagai variabel data-src2="" dalam elemen <img> yang memberikan

<div class="comment-body">
<img src="samesrc" class="commentimg" data-src2="http://topnews.net.nz/images/YouTube-3.jpg"/> random text here
</div>

<div class="comment-body">
<img src="samesrc" class="commentimg" data-src2="http://blog.brightcove.com/sites/all/uploads/FACEBOOK%20ICON.png"/> random text here
</div>

Saya tidak punya apa pun untuk diberikan atas apa yang telah saya coba karena saya tidak tahu cara mengekstrak nilai antara [img] dan [/img]

tapi secara keseluruhan INI adalah apa yang ingin saya capai jika itu tidak masuk akal!


person Yusaf Khaliq    schedule 04.12.2011    source sumber
comment
Tidak perlu jQuery, cukup jane regex biasa!   -  person Adam Rackis    schedule 05.12.2011
comment
Jadi, Anda ingin parser BBCode?   -  person Rocket Hazmat    schedule 05.12.2011
comment
@Rocket sesuatu seperti itu ya, itu membuat segalanya lebih mudah!   -  person Yusaf Khaliq    schedule 05.12.2011
comment
Apa yang sudah Anda coba sejauh ini? Tolong tunjukkan usahanya. Juga: stackoverflow.com/questions/1843320/   -  person Matt Ball    schedule 05.12.2011
comment
Saya berharap saya dapat memberi suara positif pada komentar 10 kali   -  person rossipedia    schedule 05.12.2011
comment
Saya telah mencari di internet dan saya bisa menjanjikannya, mencarinya saya tidak dapat menemukan apa pun kecuali hal-hal untuk php dan c++ yang saya tidak tahu.   -  person Yusaf Khaliq    schedule 05.12.2011
comment
@MДΓΓБДLL saya hanya mencari BBcode ketika disebutkan oleh Rocket, maaf   -  person Yusaf Khaliq    schedule 05.12.2011
comment
Dalam contoh keluaran Anda, Anda sebenarnya menghapus apa pun di div. Apakah ini yang ingin Anda capai atau hanya sebuah kesalahan?   -  person kubetz    schedule 05.12.2011


Jawaban (4)


Diuji dan sekarang berfungsi (versi asli tidak mengulangi semua elemen .comment-body, atau menemukan substring() dengan benar):

var divString, imgString;
$('.comment-body').each(
    function(){
        divString = $(this).text();
        imgString = divString.substring(divString.indexOf('[img]') + 5,divString.indexOf('[/img]'));
        console.log(imgString);
    });

JS Fiddle.


Diedit karena saya sedikit bosan, sehingga mengubah fungsi di atas menjadi fungsi yang lebih umum:

function findStringBetween(elem,bbTagStart,bbTagClose){
    var tag = bbTagStart;

    function impliedEndTag(tag){
        var impliedEnd = tag.replace(tag.substring(0,1),tag.substring(0,1) + '/');
        return impliedEnd;
    }

    var endTag = bbTagClose || impliedEndTag(tag);

    var divString = $(elem).text();
    var tagString = divString.substring(divString.indexOf('[img]') + tag.length,divString.indexOf('[/img'));
    return tagString;
}
$('.comment-body').each(
    function(){
        /* call with two, or three arguments (the third is the optional 'bbTagClose':
            1. elem = this, the DOM node,
            2. '[img]' = whatever bbCode thing you want to use (I'm not sure what's available),
            3. 'bbTagClose' = the end tag of the bbCode, assuming that the end-tag is the same as
                the opening tag, except with a '/' as the second character, the impliedEndTag() function
                will take care of it for you.
        */
        var elemString = findStringBetween(this,'[img]');
        $(this).replaceWith('<img src="' + elemString + '" class="commentimg" data-src2="'+ elemString +'"/>');
    });

Demo JS Fiddle.


Diedit mengikuti pertanyaan lebih lanjut dari OP (dalam komentar, di bawah):

...fungsinya menambahkan '' ke setiap div dengan badan komentar kelas bagaimana saya hanya bisa menerapkan kode ke elemen badan komentar yang berisi [img]gambar src di sini[/img]

Saya telah menambahkan beberapa pemeriksaan kewarasan, untuk memastikan bahwa fungsi mengembalikan false ketika tag yang ditentukan tidak ditemukan:

function findStringBetween(elem,bbTagStart,bbTagClose){
    var tag = bbTagStart;

    function impliedEndTag(tag){
        var impliedEnd = tag.replace(tag.substring(0,1),tag.substring(0,1) + '/');
        return impliedEnd;
    }

    var endTag = bbTagClose || impliedEndTag(tag);
    var divString = $(elem).text().trim(); // added .trim() to remove white-spaces

    if (divString.indexOf(tag) != -1){ // makes sure that the tag is within the string
        var tagString = divString.substring(divString.indexOf('[img]') + tag.length,divString.indexOf('[/img'));
        return tagString;
    }
    else { // if the tag variable is not within the string the function returns false
        return false;
    }
}
$('.comment-body').each(
    function(){
        /* call with two, or three arguments (the third is the optional 'bbTagClose':
            1. elem = this, the DOM node,
            2. '[img]' = whatever bbCode thing you want to use (I'm not sure what's available),
            3. 'bbTagClose' = the end tag of the bbCode, assuming that the end-tag is the same as
                the opening tag, except with a '/' as the second character, the impliedEndTag() function
                will take care of it for you.
        */
       var imgLink = findStringBetween(this,'[img]');
        if (imgLink){ // only if a value is set to the variable imgLink will the following occur
            $(this).replaceWith('<img src="' + imgLink + '" class="commentimg" data-src2="'+ imgLink+'"/>');
        }
    });

Demo JS Fiddle.


Diedit sebagai jawaban atas pertanyaan lebih lanjut dari OP (dalam komentar, di bawah):

[Apakah] ada cara untuk mencegahnya menghapus teks dalam contoh 'teks acak di sini'[?]

Ya, Anda dapat .append(), atau .prepend() gambar ke dalam elemen, setelah terlebih dahulu memperbarui teks div, dalam kode berikut saya telah menghapus string [img]...[/img], membiarkan hanya teks lainnya, disisipkan teks itu ke dalam elemen .comment-body dan kemudian menambahkan img ke dalamnya, alih-alih menggunakan replaceWith():

function findStringBetween(elem,bbTagStart,bbTagClose){
    var tag = bbTagStart;

    function impliedEndTag(tag){
        var impliedEnd = tag.replace(tag.substring(0,1),tag.substring(0,1) + '/');
        return impliedEnd;
    }

    var endTag = bbTagClose || impliedEndTag(tag);
    var divString = $(elem).text().trim();

    if (divString.indexOf(tag) != -1){
        var elemInfo = [];
        elemInfo.imgString = divString.substring(divString.indexOf(tag) + tag.length,divString.indexOf(endTag));
        elemInfo.text = divString.replace(tag + elemInfo.imgString + endTag, '');
        return elemInfo;
    }
    else {
        return false;
    }
}
$('.comment-body').each(
    function(){
        /* call with two, or three arguments (the third is the optional 'bbTagClose':
            1. elem = this, the DOM node,
            2. '[img]' = whatever bbCode thing you want to use (I'm not sure what's available),
            3. 'bbTagClose' = the end tag of the bbCode, assuming that the end-tag is the same as
                the opening tag, except with a '/' as the second character, the impliedEndTag() function
                will take care of it for you.
        */
       var elemInfo = findStringBetween(this,'[img]');
        if (elemInfo.imgString){
            // or .prepend() if you prefer
            $(this).text(elemInfo.text).append('<img src="' + elemInfo.imgString + '" class="commentimg" data-src2="'+ elemInfo.imgString +'"/>');
        }
    });

Demo JS Fiddle.


Referensi:

person David says reinstate Monica    schedule 04.12.2011
comment
Pak, saya tidak tahu dunia apa yang Anda bicarakan. Yang Saya lihat hanyalah embusan angin. - person Matt Ball; 05.12.2011
comment
Saya sudah mencoba jsfiddle.net/yusaf/kYK7e/3 tidak berhasil, bisakah saya minta sedikit bimbingan, tolong. - person Yusaf Khaliq; 05.12.2011
comment
Saya tidak ingin rewel, tapi 'itu tidak akan berhasil' bukanlah laporan bug yang bagus. Dalam hal apa tidak berhasil? - person David says reinstate Monica; 05.12.2011
comment
@Yusaf: Kode David bekerja dengan sangat baik (+1 :o) ). Anda hanya perlu menggunakan tagString untuk membuat elemen <img> (seperti di sini). - person kubetz; 05.12.2011
comment
@dzejkej, terima kasih telah mengubah fungsi untuk benar-benar mengembalikan variabel...Saya tahu ada sesuatu yang tersisa yang ingin saya lakukan sebelum mempostingnya. Selamat dan berterima kasih, +1 atas komentar Anda, Pak! =) Mengedit amandemen Anda di (Meskipun saya memilih untuk mengganti dengan gambar, daripada mempertahankan samesrc...) - person David says reinstate Monica; 05.12.2011
comment
jsfiddle.net/kYK7e/34 fungsi menambahkan '‹img›' ke setiap div dengan isi komentar kelas bagaimana saya bisa hanya menerapkan kode ke elemen isi komentar yang berisi [img]gambar src di sini[/img] - person Yusaf Khaliq; 05.12.2011
comment
@Yusaf, lihat jawaban yang diperbarui; blok kode terakhir akan berfungsi sesuai kebutuhan Anda. - person David says reinstate Monica; 05.12.2011
comment
apakah ada cara untuk mencegahnya menghapus teks dalam contoh ini 'teks acak di sini' - person Yusaf Khaliq; 05.12.2011
comment
Catatan untuk pembaca: Jika kode Anda sering memanggil findStringBetween(), pertimbangkan untuk mendefinisikan fungsi impliedEndTag() di luar findStringBetween(). Ketika suatu fungsi berisi fungsi lain maka setiap kali fungsi induk dipanggil, fungsi turunannya akan dibuat. Jadi memanggil findStringBetween() 100 kali berarti impliedEndTag() dibuat 100 kali. Lihat ini artikel. - person kubetz; 05.12.2011
comment
Yusaf, ya: lihat editan terbaru dan diposting JS Fiddle. @dzejkej: poin bagus; Aku sudah lupa tentang hal itu. =/ - person David says reinstate Monica; 05.12.2011
comment
Saya berjanji kepada Anda bahwa saya memiliki sedikit pengetahuan tentang jquery hanya dasar-dasarnya seperti addclass deleteclass dll, itulah mengapa saya tidak mencoba sesuatu jika saya memiliki pengetahuan tentang harus mulai dari mana, saya akan memilikinya seperti yang akan Anda lihat di pertanyaan lain yang lebih mendasar yang telah saya tanyakan tetapi jika Anda ingin melihat apa yang ingin saya capai selama ini saya memiliki tautan di sini jsfiddle .net/5RcEh/2 dalam beberapa hal hampir mirip dengan postingan iamge tumblr di dasbor - person Yusaf Khaliq; 05.12.2011
comment
Saya telah menambahkan beberapa bahan referensi di akhir posting, untuk Anda baca. Diperlukan beberapa saat untuk merasa nyaman dengan JavaScript, atau bahkan jQuery. Ajukan saja pertanyaan yang Anda miliki (setelah Anda mencoba menelitinya) dan, jika Anda mampu, mulailah menjawab. Saya tidak punya waktu untuk melihat Fiddle Anda sekarang, tetapi saya akan mencoba mengingat untuk melihatnya besok, sepulang kerja. =) - person David says reinstate Monica; 05.12.2011
comment
@DavidThomas Kerja bagus, David! Bonus tambahan yang bagus dengan semua bahan referensi itu :). - person kubetz; 05.12.2011
comment
@DavidThomas maaf karena bug tetapi bagaimana jika ada lebih dari 1 [img][/img] di elemen badan komentar saya telah mencoba .each untuk suatu fungsi tetapi tidak berhasil jsfiddle.net/kYK7e/89 - person Yusaf Khaliq; 05.12.2011

Jawaban alternatif dari yang ditulis oleh David Thomas.

Cara lain untuk mengimplementasikan kode ini adalah dengan menggunakan ekspresi reguler.

// inputText - input text that contains tags
// tagName - name of the tag we want to replace
// tagReplace - replacement for the tag, "$1" will get replaced by content of the tag
function replaceText(inputText, tagName, tagReplace) {
  var regExp = new RegExp('\\[' + tagName+ '\\]([^\\[]*)\\[\/' + tagName + '\\]', 'g');
  return inputText.replace(regExp, tagReplace);
}

$('.comment-body').each(function() {
  var $this = $(this);
  var replacedText = replaceText($this.text(), 'img', '<img src="$1" \/>');
  $this.html(replacedText);
});

Penerapan ini juga akan menggantikan beberapa tag dalam komentar.

Lihat cuplikan kode INI.

Catatan 1:

Saat menerapkan kode ini di lingkungan nyata, harap pertimbangkan untuk membuat ekspresi reguler terlebih dahulu untuk semua nama tag yang ditangani di luar replaceText() sehingga regExp tidak akan dibuat setiap kali replaceText() dipanggil.

Catatan 2:

Untuk mendapatkan hasil yang persis seperti pada perubahan pertanyaan:

  var replacedText = replaceText($this.text(), 'img', '<img src="$1" \/>');

to

  var replacedText = replaceText($this.text(), 'img', '<img src="samesrc" class="commentimg" data-src2="$1" \/>');
person kubetz    schedule 05.12.2011
comment
bagaimana Anda bisa mengubahnya agar berfungsi bersama tag YouTube yang saya miliki karena tag tersebut juga menggunakan $1 jsfiddle.net/x7N7S/ 11 - person Yusaf Khaliq; 05.12.2011
comment
@Yusaf: Saya menyarankan Anda untuk belajar sedikit dan bereksperimen dengan kode sehingga Anda dapat memodifikasinya sendiri. Jika Anda masih mengalami masalah, buat pertanyaan baru. Gunakan komentar hanya untuk mendiskusikan jawaban konkrit untuk pertanyaan konkrit dan bukan untuk tujuan lain. FYI: Kode dalam jawaban saya akan menempatkan seluruh tautan youtube ke $1. Untuk mengatasi masalah Anda, Anda perlu memodifikasi regexp untuk mengekstrak hanya bagian ?watch= dan bukan tautan youtube atau hanya menyisipkan ?watch=thisPart di antara tag (solusi yang lebih umum): lihat INI. - person kubetz; 05.12.2011
comment
terima kasih, saya sudah mencoba beberapa hal tetapi tidak ada gunanya, saya akan memposting tautan jika gagal mulai sekarang, maaf. - person Yusaf Khaliq; 05.12.2011
comment
@Yusaf: Senang bisa membantu :). Maaf jika kedengarannya tidak sopan, tetapi membuat pertanyaan membantu orang lain menemukan masalah yang sama dengan lebih mudah, orang membantu Anda memiliki alat yang lebih baik (seperti blok kode, kemampuan untuk mengedit setelah lebih dari 5 menit, dll.) dan mereka bisa mendapatkan perwakilan tambahan sebagai bonus :). - person kubetz; 05.12.2011
comment
Saya telah membuat solusi untuk masalah [youtube][/youtube] dan [img][/img] yang saya alami, dzejkej dan David Thomas Anda sangat brilian, terima kasih banyak. - person Yusaf Khaliq; 05.12.2011

Fungsi ini menemukan kode bb tertentu dalam string apa pun dan jika Anda mau, Anda dapat mengonfigurasinya untuk mengganti atau mengekstrak konten sebagai array dari kode bb tersebut.

//search str 
var search_str = "I love this [img]question.png[/img] Flowers, and [img]answer_1-1.png[/img] you say is that [img]answer_2-1.png[/img] good Point."
//using example
var str = bbcode_search_and_replace($('#search_str').text(),"[img]","[/img]");
$('#search_str').html(str);

function bbcode_search_and_replace(search_str, bb_opening_tag, bb_closing_tag) {
            //search str length
           var sLength = String(search_str).length;
           //bbcode opening tag length
           var fPart_length = String(bb_opening_tag).length;
           //bbcode closing tag length
           var ePart_length = String(bb_closing_tag).length;
           //position index for opening tag 
           var start_idx = 0;
           //position index for closing tag 
           var end_idx = 0; 
           //searching index for opening tag
           var pos_sIdx = 0;
           //position index for closing tag
           var pos_eIdx = 0;
           //var replacement = '[image]';
           var arr = [];
           var idx = 0;           

           //loop
           while(start_idx !== -1) {
               arr[idx] = {};                  

               start_idx = String(search_str).indexOf(bb_opening_tag,pos_sIdx);
               //check for ending
               if(start_idx === -1) {
                   //if exist, last str after closing tag
                   if(idx > 0) arr[idx]['str'] = search_str.substring(pos_sIdx);
                   console.log("arr[idx]['str'] = " + arr[idx]['str']);
                   break;
               }
               //end position index
               pos_eIdx = start_idx + fPart_length;
               end_idx = String(search_str).indexOf(bb_closing_tag,pos_eIdx);                   
               //save str inside bbtags
               arr[idx]['str'] = search_str.substring(pos_sIdx, start_idx);
               console.log("arr[idx]['str'] = " + arr[idx]['str']);
               arr[idx]['src'] =  "<img src = 'img/" + search_str.substring(start_idx + fPart_length, end_idx) + "' />";
               console.log("arr[idx]['src'] = " + arr[idx]['src']);
               arr[idx]['pos_start'] = start_idx + fPart_length;
               arr[idx]['pos_end'] = end_idx;                                

               //Update array and start pos indexes
               idx++;
               pos_sIdx = end_idx + ePart_length;                
          }

           var k = 0;
           var str = "";
           while(k < arr.length) {
               if(arr[k]['src'] === undefined) arr[k]['src'] = "";
               str += arr[k]['str'] + arr[k]['src'];
               k++;
           }

           return str;
        }  
person Amanzhol    schedule 27.06.2013

Gunakan fungsi JavaScript match(), sangat mudah digunakan

Seperti jika Anda memiliki string "Rubah coklat yang cepat melompati anjing yang malas."

& Anda memerlukan teks antara "cepat" dan "malas"

Gunakan di bawah ini

<script type="text/javascript">
   var myStr = "The quick brown fox jumps over the lazy dog.";
   var subStr = myStr.match("quick(.*)lazy");
   alert(subStr[1]);
</script>

Semoga membantu!!

person Mahesh Yadav    schedule 08.09.2017