Search

java에서 replaceAll 함수를 이용하여 문자열 내의 태그 제거하기

    /**
     * 주어진 문자열에서 태그를 모두 제거한다.
     * @param str 원본 문자열
     * @param replacement 대체할 문자열
     * @return
     */
    public static String replaceTag(String str, String replacement) {

        // <로 시작. /가 0번 또는 1번 나옴. (a-zA-Z문자가 0번 이상)이 한 묶음.
        // (\s 공백문자. a-Z문자가 0번 이상. = 나옴. > 제외한 문자 0번 이상.)이 한 묶음으로 0번 또는 1번 나옴. <- 태그 다음 공백부터 > 전까지. ==> 속성
        // 공백 0번 이상. /가 0번 또는 1번. >로 끝.
        // ex) <a href="www.naver.com" title="title" >NAVER</a>
        return str.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", replacement);
    }

    /**
     * 주어진 문자열에서 a 태그를 제외한 태그를 모두 제거한다.
     * @param str 원본 문자열
     * @param replacement 대체할 문자열
     * @return
     */
    public static String replaceTagExceptA(String str, String replacement) {

        // /aA 또는 aA가 아닌 것으로 시작하는 모든 태그
        return str.replaceAll("<(?!(/[aA])|([aA])).([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", replacement);
    }

?! 사용해야 하는 걸 알아내느라 애먹었다.
참고: http://nosyu.pe.kr/1139

(?<=.....) : 긍정형 룩비하인드 - 하위 표현식(..... 부분)이 왼쪽에 매치될 때
(?<!.....) : 부정형 룩비하인드 - 하위 표현식(..... 부분)이 왼쪽에 매치되지 않을 때
(?=.....) : 긍정형 룩어헤드 - 하위 표현식(..... 부분)이 오른쪽에 매치될 때
(?!.....) : 부정형 룩어헤드 - 하위 표현식(..... 부분)이 오른쪽에 매치되지 않을 때

(?!(/[aA])|([aA])). 에서와 같이 /a /A 또는 a A 와 매치하지 않는 것을 찾아내는 정규표현식임.
여태까지는 무조건 value="" 에 값을 넣어서 설정해왔는데
알고 보니 name="XXX" 변수명이 Action에서 사용되고 있으면 자동설정된다.

<s:select name="parentCategoryId" list="parentCategoryList" listKey="key" listValue="value" headerKey="" headerValue="선택" onchange="setCategoryListComboByParentCategory();"></s:select>

이 jsp를 결과로 하는 액션클래스에서 parentCategoryId를 멤버변수로 get/set 함수를 갖고 있으면, 액션클래스에서 parentCategoryId에 설정한 값이 위의 태그의 기본값으로 설정된다.

<s:select name="contentInfo.categoryId" list="categoryList" listKey="value" listValue="label" headerKey="" headerValue="선택" onchange="setExtMetaByCategoryId();"></s:select>

마찬가지. 단 contentInfo 클래스의 categoryId 멤버변수값