快速提问,我有一些降价HTML内容,我想将其从双星号转换为粗体。
我得到的错误是:`未捕获TypeError:无法调用方法'replace'of 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);
});
如果你能帮助我,我会非常感激,
感谢, 添
更新谢谢大家!请看这个工作演示:http://jsfiddle.net/fz5ZT/30/
答案 0 :(得分:5)
markdownable = markdownable.replace( /\*\*(.+?)\*\*/gm, '<strong>$1</strong>' );
然而,为什么不只是use an existing JavaScript Markdown library而不是表现出半心半意,善意的,注定要失败的重新尝试的尝试?
编辑:这是一个更强大的正则表达式(如Markdown)要求在“打开”之后或“关闭”之前没有空格:
var bold = /\*\*(\S(.*?\S)?)\*\*/gm;
markdownable = markdownable.replace( bold, '<strong>$1</strong>' );
答案 1 :(得分:2)
你的第一个正则表达式匹配是忽略字符串中的空格。您需要为允许的字符集[ a-z0-9]
添加空格;由于A-Z
,您不需要i
。
此外,match
返回一个数组,因此您需要获取第一个匹配项boldMatch[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);
使用var在一行上声明两个变量通常不赞成。更好:
var markdownable=$(this).html();
if (markdownable) {
comments=markdown(markdownable);
}
答案 3 :(得分: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()。
由于
答案 4 :(得分: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);
});
到目前为止,这不是最佳解决方案......但是,这是您尝试的“修复”。希望你能了解到你出错的地方。