รับสตริงระหว่างสองสายโดยใช้ jquery

ถ้าฉันมี HTML นี้

<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>

ฉันจะใช้ jquery แยกค่าระหว่าง [img] ถึง [/img] และตั้งเป็นตัวแปร data-src2="" ภายในองค์ประกอบ <img> ได้อย่างไร

<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>

ฉันไม่มีอะไรจะให้สำหรับสิ่งที่ฉันได้ลองไปแล้ว เนื่องจากฉันไม่รู้ว่าจะแยกค่าระหว่าง [img] ถึง [/img] ได้อย่างไร

แต่โดยรวมแล้ว สิ่งนี้ คือสิ่งที่ฉันพยายามทำให้สำเร็จหาก ไม่สมเหตุสมผลเลย!


person Yusaf Khaliq    schedule 04.12.2011    source แหล่งที่มา
comment
ไม่จำเป็นต้องใช้ jQuery แค่ jane regex ธรรมดา!   -  person Adam Rackis    schedule 05.12.2011
comment
คุณต้องการโปรแกรมแยกวิเคราะห์ BBCode หรือไม่?   -  person Rocket Hazmat    schedule 05.12.2011
comment
@Rocket บางสิ่งบางอย่างที่มีผลใช่มันทำให้สิ่งต่าง ๆ ง่ายขึ้น!   -  person Yusaf Khaliq    schedule 05.12.2011
comment
คุณได้ลองอะไรไปแล้ว? ได้โปรดแสดงความพยายามหน่อยเถอะ นอกจากนี้: stackoverflow.com/questions/1843320/   -  person Matt Ball    schedule 05.12.2011
comment
ฉันหวังว่าจะสามารถโหวตความคิดเห็นได้ 10 ครั้ง   -  person rossipedia    schedule 05.12.2011
comment
ฉันได้ตรวจสอบในเน็ตแล้ว และสัญญาได้เลยว่า ค้นหาแล้วไม่พบอะไรเลยนอกจากเนื้อหาสำหรับ php และ c++ ซึ่งฉันไม่รู้   -  person Yusaf Khaliq    schedule 05.12.2011
comment
@ MДΓΓBDLL ฉันค้นหา BBcode เมื่อ Rocket กล่าวถึงเท่านั้น ขออภัย   -  person Yusaf Khaliq    schedule 05.12.2011
comment
ในผลลัพธ์ตัวอย่างของคุณ คุณได้ลบสิ่งอื่นใดใน div ออกแล้ว นี่คือสิ่งที่คุณต้องการบรรลุผลสำเร็จหรือเป็นเพียงความผิดพลาด?   -  person kubetz    schedule 05.12.2011


คำตอบ (4)


ทดสอบแล้วใช้งานได้แล้ว (เวอร์ชันดั้งเดิมไม่ได้วนซ้ำผ่านองค์ประกอบ .comment-body ทั้งหมด หรือค้นหา substring() อย่างถูกต้อง):

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

JS ซอ


แก้ไข เนื่องจากฉันรู้สึกเบื่อนิดหน่อย จึงเปลี่ยนฟังก์ชันข้างต้นให้เป็นฟังก์ชันทั่วไปมากขึ้น:

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 +'"/>');
    });

การสาธิต JS Fiddle


แก้ไข ตามคำถามเพิ่มเติมจาก OP (ในความคิดเห็นด้านล่าง):

...ฟังก์ชั่นจะเพิ่ม '' ให้กับทุกๆ div ด้วย class comment-body ฉันจะใช้โค้ดกับองค์ประกอบ comment-body ที่มี [img]image src ที่นี่[/img] ได้อย่างไร

ฉันได้เพิ่มการตรวจสอบสติสองสามอย่างเพื่อให้แน่ใจว่าฟังก์ชันส่งคืนเท็จเมื่อไม่พบแท็กที่กำหนด:

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+'"/>');
        }
    });

การสาธิต JS Fiddle


แก้ไข เพื่อตอบคำถามเพิ่มเติมจาก OP (ในความคิดเห็นด้านล่าง):

[มี] มีวิธีป้องกันไม่ให้ลบข้อความในตัวอย่างนี้ 'ข้อความสุ่มที่นี่'[?]

ใช่ คุณสามารถ .append() หรือ .prepend() รูปภาพลงในองค์ประกอบได้ หลังจากอัปเดตข้อความของ div เป็นครั้งแรก ในโค้ดต่อไปนี้ ฉันได้ลบสตริง [img]...[/img] ออก เพื่อปล่อยให้ เพียง ข้อความอื่นแทรกอยู่ ข้อความนั้นในองค์ประกอบ .comment-body จากนั้นจึงต่อท้าย img แทนการใช้ 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 +'"/>');
        }
    });

การสาธิต JS Fiddle


อ้างอิง:

person David says reinstate Monica    schedule 04.12.2011
comment
ท่านคะ ฉันไม่รู้ว่าคุณกำลังพูดถึงอะไรในโลก สิ่งที่ ฉัน เห็นมีเพียงลมกระโชกแรง - person Matt Ball; 05.12.2011
comment
ฉันได้ลอง jsfiddle.net/yusaf/kYK7e/3 แล้ว มันใช้งานไม่ได้ ฉันขอได้ไหม ขอคำแนะนำหน่อยค่ะ - person Yusaf Khaliq; 05.12.2011
comment
ฉันไม่ต้องการที่จะจุกจิก แต่ 'มันใช้งานไม่ได้' ไม่ใช่รายงานข้อผิดพลาดที่ดี มันใช้งานไม่ได้ด้วยวิธีไหน? - person David says reinstate Monica; 05.12.2011
comment
@Yusaf: รหัสของ David ทำงานได้ดีมาก (+1 :o) ) คุณเพียงแค่ต้องใช้ tagString เพื่อสร้างองค์ประกอบ <img> (เช่น ที่นี่) - person kubetz; 05.12.2011
comment
@dzejkej ขอบคุณสำหรับการแก้ไขฟังก์ชันเพื่อส่งคืนตัวแปรจริง ๆ ... ฉันรู้ยังมีบางอย่างที่ฉันตั้งใจจะทำก่อนที่จะโพสต์ ขอให้ +1 จากใจจริงและขอบคุณสำหรับความคิดเห็นของคุณครับ! =) แก้ไขการแก้ไขของคุณใน (แม้ว่าฉันจะเลือกที่จะแทนที่ด้วยรูปภาพ แทนที่จะเก็บ samesrc...) - person David says reinstate Monica; 05.12.2011
comment
jsfiddle.net/kYK7e/34 ฟังก์ชันจะเพิ่ม '‹img›' ให้กับทุกๆ div ด้วย class comment-body ฉันจะใช้โค้ดกับองค์ประกอบ comment-body ที่มี [img]image src ที่นี่ได้อย่างไร[/img] - person Yusaf Khaliq; 05.12.2011
comment
@Yusaf ดูคำตอบที่อัปเดต บล็อกโค้ดสุดท้ายควรทำงานตามที่คุณต้องการ - person David says reinstate Monica; 05.12.2011
comment
มีวิธีป้องกันไม่ให้ลบข้อความในตัวอย่างนี้ 'ข้อความสุ่มที่นี่' - person Yusaf Khaliq; 05.12.2011
comment
หมายเหตุถึงผู้อ่าน: ในกรณีที่โค้ดของคุณเรียก findStringBetween() บ่อยครั้ง ให้พิจารณากำหนดฟังก์ชัน impliedEndTag() นอกเหนือจาก findStringBetween() เมื่อฟังก์ชันมีฟังก์ชันอื่น ทุกครั้งที่ฟังก์ชันพาเรนต์เรียกว่าฟังก์ชันลูกจะถูกสร้างขึ้น ดังนั้นการโทร findStringBetween() 100 ครั้งหมายความว่า impliedEndTag() ถูกสร้างขึ้น 100 ครั้ง ดู สิ่งนี้ บทความ. - person kubetz; 05.12.2011
comment
Yusaf ใช่: ดูการแก้ไขล่าสุดและโพสต์ JS Fiddle @dzejkej: จุดดี; ฉันลืมเรื่องนั้นไปแล้ว =/ - person David says reinstate Monica; 05.12.2011
comment
ฉันสัญญากับคุณว่าฉันมีความรู้เพียงเล็กน้อยเกี่ยวกับ jquery เพียงพื้นฐาน เช่น addclass Removeclass ฯลฯ นั่นคือเหตุผลที่ฉันไม่ลองทำอะไรสักอย่างหากฉันมีความรู้ว่าจะเริ่มต้นจากตรงไหน ฉันจะมีดังที่คุณจะเห็นในคำถามพื้นฐานอื่น ๆ ที่ฉันถามไปแล้ว แต่ถ้าคุณต้องการเห็นสิ่งที่ฉันพยายามทำให้สำเร็จตลอดเวลา ฉันมีลิงค์ที่นี่ jsfiddle .net/5RcEh/2 เกือบจะคล้ายกับโพสต์ tumblr iamge บนแดชบอร์ดในบางแง่ - person Yusaf Khaliq; 05.12.2011
comment
ฉันได้เพิ่มเอกสารอ้างอิงบางส่วนไว้ที่ส่วนท้ายของโพสต์เพื่อให้คุณอ่านได้ อาจใช้เวลาสักครู่เพื่อทำความคุ้นเคยกับ JavaScript หรือแม้แต่ jQuery เพียงถามคำถามที่คุณมี (เมื่อคุณ พยายาม ค้นคว้าแล้ว) และเริ่มตอบเมื่อทำได้ ฉันไม่มีเวลาดูซอของคุณตอนนี้ แต่ฉันจะพยายามจำไว้ว่าต้องดูพรุ่งนี้หลังเลิกงาน =) - person David says reinstate Monica; 05.12.2011
comment
@DavidThomas เยี่ยมมากเดวิด! โบนัสพิเศษที่ดีพร้อมเอกสารอ้างอิงทั้งหมดเหล่านั้น :) - person kubetz; 05.12.2011
comment
@DavidThomas ขออภัยที่เป็นข้อบกพร่อง แต่จะเกิดอะไรขึ้นถ้ามีมากกว่า 1 [img][/img] ในองค์ประกอบความคิดเห็น-เนื้อหา ฉันได้ลอง .each เพื่อหาฟังก์ชั่น แต่มันใช้งานไม่ได้ jsfiddle.net/kYK7e/89 - person Yusaf Khaliq; 05.12.2011

คำตอบทางเลือกสำหรับคำตอบที่เขียนโดย David Thomas

อีกวิธีหนึ่งในการติดตั้งโค้ดนี้คือการใช้นิพจน์ทั่วไป

// 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);
});

การใช้งานนี้จะแทนที่หลายแท็กภายในความคิดเห็น

ดูข้อมูลโค้ดนี้

หมายเหตุ 1:

เมื่อใช้โค้ดนี้ในสภาพแวดล้อมจริง โปรดพิจารณาสร้างนิพจน์ทั่วไปล่วงหน้าสำหรับชื่อแท็กที่จัดการทั้งหมดภายนอก replaceText() ดังนั้น regExp จะไม่ถูกสร้างขึ้นทุกครั้งที่เรียกใช้ replaceText()

หมายเหตุ 2:

เพื่อให้ได้ผลลัพธ์ที่แน่นอนเช่นเดียวกับการเปลี่ยนแปลงคำถาม:

  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
คุณจะแก้ไขสิ่งนี้ได้อย่างไรเพื่อให้ทำงานควบคู่ไปกับแท็ก YouTube ที่ฉันมีเพราะมันใช้ $1 jsfiddle.net/x7N7S/ 11 - person Yusaf Khaliq; 05.12.2011
comment
@Yusaf: ฉันขอแนะนำให้คุณศึกษาสักหน่อยและทดลองใช้โค้ดเพื่อที่คุณจะสามารถแก้ไขได้ด้วยตัวเอง หากคุณยังคงประสบปัญหา ให้ สร้างคำถามใหม่ ใช้ความคิดเห็นเพื่อหารือเกี่ยวกับคำตอบที่เป็นรูปธรรมสำหรับคำถามที่เป็นรูปธรรมเท่านั้น ไม่ใช่เพื่อวัตถุประสงค์อื่น FYI: รหัสในคำตอบของฉันจะทำให้ลิงก์ youtube ทั้งหมดไปที่ $1 ในการแก้ปัญหาของคุณ คุณต้องแก้ไข regexp เพื่อแยกเฉพาะส่วน ?watch= ไม่ใช่ลิงก์ youtube หรือแทรกเฉพาะ ?watch=thisPart ระหว่างแท็ก (วิธีแก้ปัญหาทั่วไปเพิ่มเติม): ดู นี้. - person kubetz; 05.12.2011
comment
ขอบคุณ ฉันได้ลองทำสิ่งต่าง ๆ แล้ว แต่มันก็ไร้ประโยชน์ ฉันจะโพสต์ลิงก์สำหรับความล้มเหลวนับจากนี้ ขออภัย - person Yusaf Khaliq; 05.12.2011
comment
@Yusaf: ดีใจที่ได้ช่วย :) ขออภัยหากฟังดูหยาบคาย แต่การสร้างคำถามช่วยให้ผู้อื่นพบปัญหาเดียวกันได้ง่ายขึ้น ผู้คนช่วยให้คุณมีเครื่องมือที่ดีกว่า (เช่น บล็อกโค้ด ความสามารถในการแก้ไขหลังจากผ่านไปมากกว่า 5 นาที เป็นต้น) และพวกเขาสามารถรับตัวแทนเพิ่มเติมได้ เป็นโบนัส :) - person kubetz; 05.12.2011
comment
ฉันได้สร้างวิธีแก้ปัญหาสำหรับ [youtube][/youtube] และ [img][/img] แล้ว dzejkej และ David Thomas คุณยอดเยี่ยมมาก ขอบคุณมาก - person Yusaf Khaliq; 05.12.2011

ฟังก์ชันนี้จะค้นหา bbcodes ที่ระบุในสตริงใดๆ และหากต้องการ คุณสามารถกำหนดค่าให้แทนที่หรือแยกเนื้อหาเป็นอาร์เรย์จาก bbcodes เหล่านั้นได้

//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

ใช้ฟังก์ชันจับคู่ JavaScript () ใช้งานง่ายมาก

เช่น หากคุณมีเชือก "สุนัขจิ้งจอกสีน้ำตาลกระโดดข้ามสุนัขขี้เกียจ"

และคุณต้องการข้อความระหว่าง "รวดเร็ว" และ "ขี้เกียจ"

ใช้ด้านล่าง

<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>

หวังว่ามันจะช่วยได้ !!

person Mahesh Yadav    schedule 08.09.2017