2012-04-19 34 views
0

簡単な質問、私はダブルアスタリスクから太字に変換したいmarkdown HTMLコンテンツがあります。javascriptの一致するテキスト

私は取得していますエラーは次のとおりです。 `キャッチされない例外TypeErrorは:ここ

「ヌルの '置き換え' メソッドを呼び出すことはできませんです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); 
}); 

もし私がgreを助けることができるのであればatly、

おかげで、 ティム

更新おかげですべてをそれに感謝! http://jsfiddle.net/fz5ZT/30/

+0

太字のrexepが一致しない場合、 "boldMatch"はnullになります。 "null"には、(プロトタイプの)プロパティが "replace"して呼び出すことができません - エラーをスローします。 – Bergi

+0

Bergiに感謝しますが、なぜなら私はそれにダブルアスタリスクを含むテキストを含む変数 'mardownable'を与えていると" boldMatch "はnullですか?一致してはいけませんか? –

+0

いいえ、いずれの正規表現でも一致しないマークダウン可能な空白があります。 – 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'について説明できますか?ありがとう –

+0

https://developer.mozilla.org/ja/JavaScript/Guide/Regular_Expressions#Using_Parenthesesを参照してください - ** 1st **の括弧内に見つかったテキストを参照します(左から数えて)ここで左括弧が見られた)。 – Phrogz

+0

ありがとう、素晴らしい、私は前にそれを見ていたが、それが意味するものを知らなかった! –

2

あなたの最初の正規表現は、文字列の空白を無視しています。許可された文字セットにスペースを追加する必要があります。[ a-z0-9]; iのためにA-Zは必要ありません。

また、matchは配列を返します。返される文字列にアクセスするには、最初に一致するものをboldMatch[0]にする必要があります。

+2

また、boldMatchが何かを見つけたかどうかを確認する必要があります。もしそうでなければ、それはヌルです(空の文字列ではありません)。そのため、エラーが発生します。 – yoavmatchulsky

+0

こんにちは、yoavmatchulskyが、太字ではないものが見つかるはずですか?アスタリスクには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); 

宣言:

このコード行は、それが困難で何が起こっているか追跡することができます1行にvaを持つ2つの変数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

関連する問題