[JAVA] html 정규식으로 img src 어트리뷰트 치환
주어진 html 코드(String 변수)에서 src 부분만 가져와서 원하는 문자열로 치환하는 코드.
|
import java.util.regex.Matcher; import java.util.regex.Pattern;
public class ReplaceTest {
public static void main(String[] args) { StringBuffer htmlBuff = new StringBuffer(); htmlBuff.append(“<html>\n”); htmlBuff.append(“<body>\n”); htmlBuff.append(“<img src=\”1.jpg\”/>\n”); htmlBuff.append(“<img src=\”2.jpg\”/>\n”); htmlBuff.append(“<img src=\”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAXSURBVBhXY3gro8LA8B9MQqn/MDEZFQCUAgne4kekCgAAAABJRU5ErkJggg==\”/>\n”); htmlBuff.append(“</body>\n”); htmlBuff.append(“</html>\n”); String html = htmlBuff.toString(); System.out.println(“[AS-IS]”); System.out.println(html); Pattern imgSrcPattern = Pattern.compile(“<img[^>]*src=[\”‘]?([^>\”‘]+)[\”‘]?[^>]*>”); Matcher matcher = imgSrcPattern.matcher(html); while (matcher.find()) { String imgSrc = matcher.group(1); if (imgSrc == null || imgSrc.length() == 0) { continue; } // BASE64 이미지 skip if (imgSrc.trim().startsWith(“data:image”)) { continue; } String newUrl = “http://localhost/img/“ + imgSrc; html = html.replace(imgSrc, newUrl); }
System.out.println(“[TO-BE]”); System.out.println(html); } }
|
실행결과
|
[AS-IS] <html> <body> <img src=”1.jpg”/> <img src=”2.jpg”/> <img src=”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAXSURBVBhXY3gro8LA8B9MQqn/MDEZFQCUAgne4kekCgAAAABJRU5ErkJggg==”/> </body> </html>
[TO-BE] <html> <body> <img src=”http://localhost/img/1.jpg”/> <img src=”http://localhost/img/2.jpg”/> <img src=”data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAIAAADZSiLoAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAXSURBVBhXY3gro8LA8B9MQqn/MDEZFQCUAgne4kekCgAAAABJRU5ErkJggg==”/> </body> </html>
|
단, 위의 코드에는 문제점이 있다.
replace 로 치환하기 때문에 원하는 부분이 아닌 다른 부분이 치환될 수 있다는 것.
예를 들어 img src 어트리뷰트의 값이 1.jpg 일 때 아래 두 가지 문제가 있다.
(1) 다른 img 태그의 src 값이 동일한 1.jpg 일 때 같이 치환되는 문제
(2) img 태그와 상관없이 본문에 들어있는 1.jpg 문자열 값도 치환되는 문제
이런 점이 크게 문제가 되지 않은 경우 그대로 쓰면 된다.
그렇지 않을 경우 아래처럼 개선할 필요성이 있다.
(1) 2개 이상 발견될 경우에도 첫번째로 발견된 부분만 치환해야 함.
replaceFirst 가 알맞지만 이건 정규식이 적용되는 메서드라서 위험하므로 직접 메서드를 만들어쓰는 것을 추천한다. (cf : replaceOne)
참고사이트 : https://blog.naver.com/bb_/220638989936
(2) 치환하고자 하는 부분(src 어트리뷰트 값)만 치환하여 html 본문내용 훼손이 없어야 함