Вопрос по jquery, javascript – Невозможно прочитать свойство 'длина' ноль в JavaScript для цикла

3

Я пытаюсь создать редактор уценки, как в Stack Overflow.

Я получаю эту ошибку, указанную в заголовке, если на самом деле не набираю звездочку И фразу, содержащую http: //, в текстовое поле. Если я наберу только фразу, содержащую звездочку, ошибка относится к этой строке:if(linkify.length!==0)

Вот этоjsfiddle чтобы показать вам, что я имею в виду.

Вот мой HTML:

<textarea></textarea>
<div></div><button type="button">Markdownify</button>

Вот мой JS:

var val=$('textarea').val(), boldify = val.match(/\*\*[A-Za-z0-9]+\*\*/gim),
italicify = val.match(/\*[A-Za-z0-9]+\*/gim),linkify = val.match(/http\:\/\/[A-z0-9]+\.[A-z0-9]+/gim);

$(document.body).on('click', 'button', function() {

val=$('textarea').val(), boldify = val.match(/\*\*[A-Za-z0-9]+\*\*/gim),
italicify = val.match(/\*[A-Za-z0-9]+\*/gim),linkify = val.match(/http\:\/\/[A-z0-9]+\.[A-z0-9]+/gim);

if (boldify.length!== 0){
            for (var i=0; i < boldify.length; i++)  {
                var boldMatch= boldify[i],  
                boldReplace = boldMatch.replace(/\*\*[A-z0-9]+\*\*/gim, '<span style="font-weight:bold;color:blue;">'+boldMatch+'</span>'),
                val = val.replace(boldMatch, boldReplace);     
            }
        val = val.replace(/\*\*/gi, "");
}

if(italicify.length!== 0){
    for(var j=0; j < italicify.length; j++){
    var italicMatch= italicify[j],
     italicReplace = italicMatch.replace(/\*[A-z0-9]+\*/gim, '<span style="font-style:italic;color:red;">'+italicMatch+'</span>');
    val = val.replace(italicMatch, italicReplace); 
    }
    val = val.replace(/\*/gi, "");
}

if(linkify.length!== 0){
    for(var k=0; k < linkify.length; k++){
    var linkMatch= linkify[k],
    linkReplace = linkMatch.replace(/http:\/\/[A-z0-9]+\.[A-z0-9]+/gim, '<a href="'+linkMatch+'">'+linkMatch+'</a>');
        val = val.replace(linkMatch, linkReplace);
    }
}

$('div').html(val);
});

Любая помощь будет принята с благодарностью.

Ваш Ответ

2   ответа
10

match функция, которая возвращает нуль, если строка не соответствует предоставленному регулярному выражению, используетtest функция, которая возвращает истину / ложь, а затем, если вам это нужно, вы можете использоватьmatch функция.

в основном вы выполняетеnull.length который, очевидно, недействителен какmatch возвращает вам ноль

или вы могли бы просто выполнитьnull проверьте, прежде чем проверять длину, и просто сопоставьте регулярное выражение один раз.

if(linkify!==null && linkify.length!== 0)
{
  //do smthing
}
Error: User Rate Limit Exceeded tim peterson
Error: User Rate Limit Exceededjsperf.com/regexp-test-vs-match-m5
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededif(linkify && linkify.length)Error: User Rate Limit Exceeded tim peterson
3

& APOS; linkify & APOS; равно нулю, когда нет 'http: //'; совпадение в тексте, поэтому вам нужно проверить это условие:

if(linkify && linkify.
Error: User Rate Limit ExceededkeyupError: User Rate Limit Exceeded tim peterson
Error: User Rate Limit Exceeded&&Error: User Rate Limit Exceeded tim peterson
Error: User Rate Limit Exceeded

Похожие вопросы