2012-04-19 6 views
0

빠른 질문, 나는 더블 별표에서 굵은 글씨로 변환하려는 markdown HTML 콘텐츠가 있습니다.javascript match 텍스트를 대체하십시오

내가지고있어 오류가 있습니다 :`catch되지 않은 형식 오류 : 여기에

'널 (null)의'대체 '방법을 호출 할 수 없습니다 년대 jsfiddle : 여기 http://jsfiddle.net/fz5ZT/9/

년대 HTML :

<div class="comments">comment 1** is good**</div> 
<div class="comments">comment 2**is bad**</div> 

가 여기에 JS :

function markdown(markdownable){ 

    var boldMatch = markdownable.match(/\*\*[A-Za-z0-9]+\*\*/gim), 
    boldReplace = boldMatch.replace(/\*\*[A-z0-9]+\*\*/gim, '<span style="font- weight:bold;color:blue;">'+boldMatch+'</span>'),     
    markdownable = markdownable.replace(boldMatch, boldReplace),  
    markdownable = markdownable.replace(/\*\*/gi, ""); 

    return markdownable; 
} 

$('.comments').each(function(){ 
    var markdownable=$(this).html(), comments=markdown(markdownable); 
}); 

내가 도와 줄 수있는 경우 atly,

덕분에 그것을 감사, 팀

갱신 덕분에 모든! 작동중인 데모는 다음을 참조하십시오. http://jsfiddle.net/fz5ZT/30/

+0

굵은 rexep이 일치하지 않으면 "boldMatch"는 null입니다. "null"은 (프로토 타입) "교체"속성을 호출하지 않고 오류를 던집니다. – Bergi

+0

Bergi에게 감사의 말을 전하지만, 왜 "boldMatch"가 두 개의 별표가있는 텍스트를 포함하는 변수'mardownable'을 제공한다면 null입니까? 일치하지 않아야합니까? –

+0

아니요, markdownable에는 공백이 없으며 정규식 중 어느 것과도 일치하지 않습니다. – Bergi

답변

5
markdownable = markdownable.replace(/\*\*(.+?)\*\*/gm, '<strong>$1</strong>'); 

그러나, 대신 수행하는 마음이 내키지 않는, 좋은 의도, 운명 - 투 - 실패 바퀴를 개혁의 시도, 왜 그냥 use an existing JavaScript Markdown library?

편집는 :

var bold = /\*\*(\S(.*?\S)?)\*\*/gm; 
markdownable = markdownable.replace(bold, '<strong>$1</strong>'); 
+0

'$ 1'에 대해 설명해 주시겠습니까? thanks –

+0

https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions#Using_Parentheses를 참조하십시오. ** 첫 번째 ** 괄호 집합 안에 발견되어 캡처 된 텍스트를 나타냅니다 (왼쪽부터 세어 짐). 왼쪽 괄호가있는 곳). – Phrogz

+0

고마워, 위대한, 나는 전에 그것을 보았지만 그것이 의미하는 것을 몰랐다! –

2

첫 번째 정규식 일치 문자열의 공백을 무시합니다. 허용되는 문자 세트에 공백을 추가해야합니다 ([ a-z0-9]). i 때문에 A-Z이 필요하지 않습니다.

또한 match은 배열을 반환하므로 반환되는 문자열에 액세스하려면 boldMatch[0]이라는 첫 번째 일치 항목을 가져와야합니다.

+2

또한 boldMatch가 무언가를 찾았는지 확인해야합니다. 왜냐하면 그렇지 않다면 null (그리고 빈 문자열이 아닙니다)입니다 - 그래서 당신은 오류가 있습니다. – yoavmatchulsky

+0

안녕하십니까. 굵게 표시해서는 안되는 것이 있습니까? 별표와 함께 2 개의 설명이 있습니다. –

1

작업 할 값이 있다는 것을 알 때까지 (즉 일치하는 항목이없는 경우) boldMatch에서 .replace()를 호출하고 싶지는 않습니다.

안전한 컴퓨팅 :

var boldMatch = markdownable.match(/\*\*[A-Za-z0-9]+\*\*/gim); 
if (boldMatch) { 
    var boldReplace = boldMatch.replace(/\*\*[A-z0-9]+\*\*/gim, '<span style="font- weight:bold;color:blue;">'+boldMatch+'</span>'); 
} 

업데이트 :

var markdownable=$(this).html(), comments=markdown(markdownable); 

선언 :

이 줄의 코드도 어려운 무슨 일이 일어나고 있는지 추적 할 수 있습니다 한 줄에 va가있는 두 변수 r은 일반적으로 눈살을 찌푸리게됩니다. 더 나은 :

var markdownable=$(this).html(); 
if (markdownable) { 
    comments=markdown(markdownable); 
} 
+0

안녕하세요 David, 응답 해 주셔서 감사합니다.하지만 과감한 사실을 찾아서는 안됩니까? 별표와 함께 2 개의 설명이 있습니다. –

+0

Bergi가 언급했듯이 테스트 케이스 중 첫 번째 테스트 케이스가 일치하지 않습니다. 이것을 테스트 케이스로 해보면 무슨 일이 일어나는지보실 수 있습니다 :

1

당신이 걸릴 수 있습니다 될 수있다 여기에 (마크 다운 같은) "열기"후 또는 "닫기"이전에는 공백 권리은없는가 필요로하는보다 강력한 정규식입니다 다음과 같은 솔루션을 살펴 :

:

Find text string using jQuery?

을 나는 당신이 매우 비슷한 일을 할 필요가 생각

$('*:contains("I am a simple string")').each(function(){ 
if($(this).children().length < 1) 
     $(this).html( 
      $(this).text().replace(
       /"I am a simple string"/ 
       ,'<span containsStringImLookingFor="true">"I am a simple string" </span>' 
      ) 
     ) 
}); 

요소를 굵게 만들려면 대체가 수행 된 후에 addClass()를 사용해야합니다.

감사

1
function markdown(markdownable) { 

    var boldMatch = markdownable.match(/[\*]{2}(.+)?[\*]{2}/gim); 
    if (boldMatch && (boldMatch = boldMatch[0])) { 
     var boldReplace = boldMatch.replace(/[\*]{2}(.+)+?[\*]{2}/gim, '<span style="font-weight:bold;color:blue;">' + boldMatch + '</span>'); 
     markdownable = markdownable.replace(boldMatch, boldReplace); 
     markdownable = markdownable.replace(/\*\*/gi, ""); 
    } 
    return markdownable; 
} 

$('.comments').each(function() { 

    var markdownable = $(this).html(), 
     comments = markdown(markdownable); 

    console.log(comments); 
});​ 

이 그러나 당신의 시도에 대한 '수정'입니다 ... 멀지 않은 최적의 솔루션입니다. 다행히도 당신이 잘못 된 곳에 대해 뭔가를 배울 수 있기를 바랍니다.

+0

정규식에서'\ *'대신'[\ *]'를 사용할 이유가 없습니다. 그리고 왜 당신은 내용의 시작 부분에 공간이 필요합니까? – Phrogz

+0

인데 이는 해당 경기의 요구 사항 이었기 때문입니다. '** 나쁜''** 좋은' – rlemon

+0

아; 개인적으로는 원래의 정규 표현식이 아니기 때문에 Markdown이 필요로하는 것과는 정반대로 그 의미가 무엇인지 의심 스럽습니다. 나는 "좋은"과 "나쁜"이 단지 의견의 징후라고 생각했다. 하지만 아마도 당신 말이 맞아요. – Phrogz

관련 문제