2014-09-29 4 views
0

데이터베이스에서 검색하는 html 파일과 여러 jpg 파일이 있습니다. 이 HTML에는 여러 개의 img scr = "..." 태그가 있으며 각 태그에는 고객의 URL을 기반으로 한 절대 경로가 있습니다. 내 작업은 html 및 이미지 파일을 로컬 드라이브에 압축 해제 한 후 해당 절대 경로 각각을 상대 경로로 바꾸는 것입니다. ,여러 html 절대 경로 문자열을 상대 경로로 바꿉니다.

1) 고객의 URL은 HTML 파일 내의 모든 동일합니다 :

예를 들어, 내가 가진 :

... 
<img src="www.something.com\images\image1.jpg"> 
... 
<img src="www.something.com\images\image2.jpg"> 
... 
<img src="www.something.com\images\image3.jpg"> 

그리고 내가 원하는 :

... 
<img src="image1.jpg"> 
... 
<img src="image2.jpg"> 
... 
<img src="image3.jpg"> 

과제는 그러나 다른 html에는 다른 고객 URL이 있습니다. 그래서 모든 HTML에서 동일한 문자열을 단순히 찾을 수는 없습니다.
2) java의 기본 라이브러리를 사용하여 Java로 작성해야합니다. Jsoup 나 다른 제 3 자 병을 사용할 수 없습니다.

질문 : 갈 방법이 될 것입니다 정규 표현식을 사용하여 완전히 대체하기를 추정하지만, 다른 고객에 대한 htmls의 경우에는 다양한 검색 문자열을 작성하는 방법을 잘

. 답변을 얻기 위해 스택 제출을 샅샅이 조사했지만이 고유 한 시나리오와 문제점을 가진 스택 제출을 찾지 못했습니다.

내 질문에이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

미리 감사드립니다.

+0

나는 모든 해답은 크고 작은 주셔서 감사합니다. 그리고 여기에 있던 사람들은 제거되었습니다. 나는 각각을 시도 할 것이다. – MaxAx

답변

0

정규식 :

(<img src=\").*?\\\\([^\\\\\"]*\">) 

교체 문자열 :

$1$2 

DEMO

+0

이 답변을 완전히 이해하지 못했습니다. 컨텍스트를 조금 더 제공 할 수 있습니까? – MaxAx

+0

''부분을 캡처합니다.일치하는 모든 문자를 그룹 1과 2의 문자로 바꾸면 원하는 결과를 얻을 수 있습니다. –

0

난의 크기에 따라, 이것에 대한 DOM, SAX 또는 STAX을 사용하여 문서.

DOM을 사용하는 빠르고 간단한 예가 있습니다 (몇 가지 변경 사항을 적용해야합니다).

String minimalHtml = "<html><head></head><body>" + 
     "<img src=\"www.something.com/images/image1.jpg\"></img>" + 
     "<img src=\"www.something.com/images/image2.jpg\"></img>" + 
     "<img src=\"www.something.com/images/image3.jpg\"></img>" + 
     "</body></html>"; 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(new InputSource(new StringReader(minimalHtml))); 
NodeList nl = doc.getElementsByTagName("img"); 
for (int i = 0; i < nl.getLength(); i++) { 
    NamedNodeMap nnm = nl.item(i).getAttributes(); 
    for (int j = 0; j < nnm.getLength(); j++) { 
     String oldValue = nnm.item(j).getNodeValue(); 
     int index = oldValue.lastIndexOf("/") + 1; 
     if (index > -1 && index < oldValue.length()) { 
      nnm.item(j).setNodeValue(oldValue.substring(index)); 
     } 
    } 
} 
// printing out doc 
StringWriter sw = new StringWriter(); 
TransformerFactory tf = TransformerFactory.newInstance(); 
Transformer transformer = tf.newTransformer(); 

transformer.transform(new DOMSource(doc), new StreamResult(sw)); 
System.out.println(sw.toString()); 

출력

<html> 
<head> 
<META http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
</head> 
<body> 
<img src="image1.jpg"><img src="image2.jpg"><img src="image3.jpg"></body> 
</html> 
+0

그러나이 접근법이 마음에 듭니다. 내 html에 jquery가 포함되어있어서 DOM이 어떻게 좋을지 잘 모르겠습니다. – MaxAx

+0

* 이론적으로는 문제가되어서는 안됩니다 ... jQuery에 익숙하지는 않지만 그럼에도 불구하고 시도해 보겠습니다. – Mena

+0

이 코드에'import'를 추가하십시오. Java 같은 초보자가 코드를 보면서 적절한 가져 오기 파일을 찾기 란 어렵습니다. – Dipu