ง่าย ๆ เข้าไว้! พูดในสิ่งที่คุณไม่สามารถทำได้แทนที่จะเป็นอะไรก็ได้ :)
ดังที่ได้กล่าวมาแล้ว URL สามารถค่อนข้างซับซ้อนโดยเฉพาะอย่างยิ่งหลังจาก '?' และไม่ใช่ทั้งหมดเริ่มต้นด้วย 'www' เช่นmaps.bing.com/something?key=!"£$%^*()&lat=65&lon&lon=20
ดังนั้นแทนที่จะมี regex ที่ซับซ้อนที่จะไม่เจอเคสขอบทั้งหมดและจะยากที่จะรักษาวิธีนี้ง่ายกว่ามากซึ่งใช้งานได้ดีสำหรับฉันในทางปฏิบัติ
การจับคู่
http(s):// (anything but a space)+
www. (anything but a space)+
โดยที่ 'อะไรก็ได้' คือ[^'"<>\s]
... โดยทั่วไปเป็นการจับคู่ที่โลภจับคุณไปพบกับพื้นที่พูดคำพูดวงเล็บมุมหรือจุดสิ้นสุดของบรรทัด
นอกจากนี้:
อย่าลืมตรวจสอบว่ามันไม่ได้อยู่ในรูปแบบ URL เช่นข้อความมีhref="..."
หรือsrc="..."
เพิ่ม ref = nofollow (ถ้าเหมาะสม)
วิธีแก้ปัญหานี้ไม่ได้ "ดี" ตามที่กล่าวไว้ข้างต้น แต่ง่ายกว่ามากและใช้งานได้ดีในทางปฏิบัติ
if html.match( /(href)|(src)/i )) {
return html; // text already has a hyper link in it
}
html = html.replace(
/\b(https?:\/\/[^\s\(\)\'\"\<\>]+)/ig,
"<a ref='nofollow' href='$1'>$1</a>"
);
html = html.replace(
/\s(www\.[^\s\(\)\'\"\<\>]+)/ig,
"<a ref='nofollow' href='http://$1'>$1</a>"
);
html = html.replace(
/^(www\.[^\s\(\)\'\"\<\>]+)/ig,
"<a ref='nofollow' href='http://$1'>$1</a>"
);
return html;
URL regexp from Component
ไม่มีคนให้ความเห็นคำอธิบายเกี่ยวกับสิ่งที่กำลังทำอยู่จะเป็นประโยชน์Autolinker.js
มีความคิดเห็นดีมากและมีการทดสอบurlize.js
ห้องสมุดเชื่อมโยงกับใน คำตอบของVebjørn Ljosaยังมีลักษณะ featureful และบำรุงรักษาอย่างดีแม้ว่ามันจะไม่ได้มีการทดสอบ