この関数を使用して、テキストをクリック可能なリンク(<a href=""> </a>
)に変換し、画像のURLをimgタグ(<img src="" />
)に変換しています。
const parsecontent = (text)=>{
var ishyperlink= /([^\S]|^)((https?\:\/\/)(\S+))/gi;
return (text || "").replace(ishyperlink,
function(match, space, url){
var isimglink = /https?:\/\/.*\.(?:png|jpg|gif|jpeg)/i;
if (url.match(isimglink)) {
return space + '<a href="' + url + '"><img src="' + url + '" /></a>';
}
return space + '<a href="' + url + '">' + url + '</a>';
}
);
}
このように使う
const div = document.querySelector("#content");
div.innerHTML = parsecontent(div.innerHTML);
コンテンツに適切なスペースがあれば、問題なく動作します。それはリンクします、それが失敗するスペースで区切られていない画像のURL。plsは私がこれを修正するのを手伝ってくれますか?
Codepenはこちらhttps://codepen.io/dagalti/pen/GRqpYLp
私はあなたのテストケースを満たすように調整された正規表現を思いついた。
この正規表現は、URLを照合する方法です。
((https?\:\/\/)([\w!"#$%&\'()*+,-./@:;=\^_`{|}~]*))
あなたの例では、間に空白を入れずに2つのURLがあります。URLとURL以外の文字列の間に空白がない場合はどうなりますか?我々は可能性があり、それは(例えば、TLDに到達したとき、一致を終了.com
、.org
等)。ただし、あなたの例を満たすために、空白なしで区切られた2つのURLを処理していると仮定しています。その場合、新しいURLの開始に気付いたときに、一致を終了します(?=https?)
。
([^\S]|^)((https?\:\/\/)([\w!"#$%&\'()*+,-./@:;=\^_`{|}~]*))(?=https?)
次に、空白で囲まれたURLを照合します。
((https?\:\/\/)([\w!"#$%&\'()*+,-./@:;=\^_`{|}~]*))
これらすべてをまとめると、次の正規表現が得られます。
([^\S]|^)((https?\:\/\/)([\w!"#$%&\'()*+,-./@:;=\^_`{|}~]*))(?=https?)|((https?\:\/\/)([\w!"#$%&\'()*+,-./@:;=\^_`{|}~]*))
replace
ロジックも少し調整する必要があります。
const parsecontent = (text)=>{
var ishyperlink= /([^\S]|^)((https?\:\/\/)([\w!"#$%&\'()*+,-./@:;=\^_`{|}~]*))(?=https?)|((https?\:\/\/)([\w!"#$%&\'()*+,-./@:;=\^_`{|}~]*))/gi;
return (text || "").replace(ishyperlink,
function(url){
var isimglink = /https?:\/\/.*\.(?:png|jpg|gif|jpeg)/i;
if (url.match(isimglink)) {
return '<a href="' + url + '"><img src="' + url + '" /></a>';
}
return '<a href="' + url + '">' + url + '</a>';
}
);
}
この正規表現は非常に冗長である、あなたのテストケースを満たす、より簡潔な方法があるかもしれません(私はありませんregexpertが)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加