Tak. Najprostszym sposobem jest użycie wyrażeń regularnych do zastąpienia rzeczy, które wyglądają jak link do ich powiązanych odpowiedników. Coś jak:
node.innerHTML = node.innerHTML.replace(/(http:\/\/[^\s]+)/g, "<a href='$1'>$1</a>")
(mój RegEx jest trochę zardzewiały, więc być może będziesz musiał grać ze składnią). To tylko prosty przypadek. Musisz uważać na wtrysk skryptu tutaj (na przykład, jeśli mam http://"><script>doevil()</script>
). Jednym ze sposobów obejścia tego problemu jest użycie funkcji link budynku:
node.innerHTML = node.innerHTML.replace(/ ... /g, buildLink($1));
Gdzie buildLink()
może sprawdzić, czy adres URL nie zawiera niczego szkodliwego.
Jednak metoda RegEx-innerHTML nie będzie działać zbyt dobrze na dużych ciałach tekstu, ponieważ odrywa i odbudowuje całą zawartość HTML węzła. Można to osiągnąć za pomocą metod DOM, a także: odniesienie
- Znajdź, aby węzła tekstowego
- w treści, znaleźć rozpoczęcia i indeksy końcu adresu URL
- Korzystanie
splitText()
metoda podzielić węzeł na 3: przed, link, po
- Załóż
<a>
węzeł z href
, która jest taka sama jak w przypadku łącza
- Korzystanie
insertBefore()
wstawić ten węzeł <a>
przed linkiem
- Zastosowanie
appendChild()
przenieść link do <a>
węzła
+1 dla drugiej metody, znacznie bardziej wydajnej. –