كيف يمكنني حلقة من خلال مباريات ريجيكس داخل استبدال في جافا سكريبت؟

StackOverflow https://stackoverflow.com/questions/1261985

سؤال

لدي جافا سكريبت التالية (المسافات في <P>S غير كسر):

var html = '...<li>sub 2</li></ol></li></ol>\n\
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subsub 1</p>\n\
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ii.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subsub 2</p>\n\
<ol start="2"> \n\
<ol start="3"> \n\
<li>sub 3</li></ol>...';

$(function () {
    var nestedListFixer = /(?:<\/li><\/ol>\s*)+(?:<p>(?:&(?:nbsp|\#0*160|x0*A0);)+(?:\s[ivxlcdm]+\.)(?:&(?:nbsp|\#0*160|x0*A0);)+\s(.*?)<\/p>\s*)+(?:<ol(?:\sstyle=\"[^\"]+\")?\sstart=\"[^\"]+\">\s*)+/i;
    html = html.replace(nestedListFixer, function($0, $1){
        var lis = ""
        $.each($1, function () {
            lis += "<li>" + this + "</li>\n";
        });
        alert("<ol>\n" + lis + "</ol></li>");
        return "<ol>\n" + lis + "</ol></li>";
    });
});

ال alert()الإخراج:

<ol>
<li>s</li>
<li>u</li>
<li>b</li>
<li>s</li>
<li>u</li>
<li>b</li>
<li> </li>
<li>2</li>
</ol></li>

إليك ما كنت آمل أن يكون:

<ol>
<li>subsub 1</li>
<li>subsub 2</li>
</ol></li>

كيف يمكنني حلقة بشكل صحيح من خلال كل مباراة في $1?

تحديث: نمط مبسط ومثال للمثال:

var text = '1ab2cb3cd4ab5cb6cd7';

$(function () {
    var textFixer = /(?:a)(?:b(.*?)c)+(?:d)/i;
    text = text.replace(textFixer, function($0, $1){
        var numbers = "";
        $.each($1, function () {
            numbers += this;
        });
        alert(numbers);
        return numbers;
    });
    alert(text);
});

// actual text:
// 13467
// desired text:
// 1234567
هل كانت مفيدة؟

المحلول 2

إليك الحل الذي توصلت إليه لكنه لا يبدو أنه فعال للغاية:

$(function () {
    var nestedListFixer = /(?:<\/li><\/ol>\s*)+(?:<p>(?:&(?:nbsp|\#0*160|x0*A0);)+(?:\s[ivxlcdm]+\.)(?:&(?:nbsp|\#0*160|x0*A0);)+\s(.*?)<\/p>\s*)+(?:<ol(?:\sstyle=\"[^\"]+\")?\sstart=\"[^\"]+\">\s*)+/gi;
    var nestedListItem = /<p>(?:&(?:nbsp|\#0*160|x0*A0);)+(?:\s[ivxlcdm]+\.)(?:&(?:nbsp|\#0*160|x0*A0);)+\s(.*?)<\/p>\s*/gi;

    // fix nested lists
    html = html.replace(nestedListFixer, function($0, $1){
        var lis = ""
        $.each($0.match(nestedListItem), function () {
            lis += "<li>" + this.replace(nestedListItem, "$1") + "</li>\n";
        });
        return "<ol>\n" + lis + "</ol></li>";
    });
});

... أو للمثال الأبسط أعلاه:

$(function () {
    var textFixer = /(?:a)(?:b(.*?)c)+(?:d)/gi;
    var textItem = /b(.*?)c/gi;

    text = text.replace(textFixer, function($0, $1){
        var numbers = "";
        $.each($0.match(textItem), function () {
            numbers += this.replace(textItem, "$1");
        });
        return numbers;
    });
});

القيام .replace() استبدال، داخل حلقة من .match() صفيف، داخل مخصص .replace() الوظيفة فقط لا يبدو أنها اقتصادية للغاية. إنه يعطيني الناتج الذي كنت أبحث عنه رغم ذلك.

نصائح أخرى

المثال المحدث الذي قدمته من شأنه أن تطابق فقط "3" وليس "13467" كما وصفته. إذا قمت بتغيير RegexP الخاص بك للقيام بمطابقة عالمية، فسوف يعود "36" وما زلت لا "13467".

مثالك الأول لا يخرج أي شيء أيضا.

هل تحاول فقط الحصول على التطابقات للتعبير المنتظم وحلقة من خلال المباريات؟

لو ذلك،

var text = '1ab2cb3cd4ab5cb6cd7';
var matches = text.match(/(\d)/g);
for (i=0; i<matches.length; i++) {
   alert(matches[i]);
}

يمكن أن تستخدم حلقة جميلة نمط الخطاف:

var text = '1ab2cb3cd4ab5cb6cd7';
text.match(/(\d)/g).forEach(function(element,index){
   console.log(element)
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top