2009-07-28 4 views
1

문자열을 가져 와서 하이퍼 링크를 래핑하는 정규식 대체가 필요합니다 (단, catch는 여기에 해당합니다). 이미 하이퍼 링크로 둘러싸여 있습니다. 어떻게하면 좋을까요? 나는 텍스트를 찾을 경우하이퍼 링크로 텍스트를 래핑하는 방법 하이퍼 링크로 래핑되지 않은 경우에만

 
The <a href="http://www.stackoverflow.com/">quick brown</a> fox. 

:하지만

 
The quick brown fox. 

내가 이런 "빠른 갈색"링크를 만들고 싶어 :

따라서, 예를 들어, 텍스트를 보자

 
The <a href="http://www.stackoverflow.com/">quick brown</a> fox. 

다른 하이퍼 링크에서 "빠른 갈색"을 감싸지 않았는지 확인하고 싶습니다.

어떻게하면됩니까?

답변

0

렌더링 된 HTML을 구문 분석하는 것처럼 보입니다. 원시 HTML을 구문 분석하지 않는 이유는 무엇입니까? 그러면 문제는 간단 해집니다

+0

내가 볼 수 없어 URL이 '원시'HTML로 발견되지 않는 경우에만 키워드를 교체 할 쉬울 수 있습니다 어떻게 사소한가. 원시 HTML과 렌더링 된 HTML의 차이를 이해하지 못합니다. html은 형식입니다. 브라우저는 형식을 인터페이스로 렌더링합니다. 정규식을 사용하는 문서는 html 문서입니다. 따라서 html을 제거 할 방법이 없습니다. –

1

어딘가에 찾아올 수 있습니다. 전혀 완벽하지는 않지만, 텍스트가 이미 앵커 태그에 싸여 있는지를 빠르게 확인할 수 있습니다.

(?<=>)quick brown(?=</a>) 

주 : lookbehind 어설 션은 고정 길이 (적어도 PCRE) 여야합니다.

1

링크를 둘러싸는 문자열이 YOUR_STRING 인 경우 먼저 YOUR_STRING이 링크 태그로 둘러싸인 모든 장소를 식별하십시오.

정규식 = >을 포함하지 않는 제로 이상의 길이의 이어지는데 <a

<a[^>]*>[^<]*(YOUR_STRING)[^<]*</a>

시작한다.

<는 포함되지 않은 길이가 0 이상 이어지는데 >

하였다.

다음으로 YOUR_STRING 이것은 캡처 그룹입니다.

길이가 0 이상이고 <을 포함하지 않는 시퀀스가 ​​계속됩니다.

이제 캡처 그룹 YOUR_STRING이 링크 태그로 둘러싸인 장소의 문자 오프셋을 식별 할 수 </a>

하였다.

이외의 다른 모든 곳에서는 YOUR_STRING이 실제로 발생하는 다른 모든 장소에서 링크 태그를 감싸 쌉니다.

보너스 포인트 : 당신이 문자열에 텍스트를 삽입 할 때, 당신은 문자 오프셋을 변경할 수 있습니다, 또는 당신의 정규식이 해, ConcurrentModificationException는 분석 시간 동안 텍스트를 삽입 할 수 없습니다/(당신이 어떤 라이브러리에 따라 던질 수 있습니다 사용).이 문제를 처리하는 가장 좋은 방법은 별도의 StringBuffer를 만들고 원래 문자열을 분석 할 때 텍스트를 추가하는 것입니다.

참고 : 하이퍼 링크 태그를 식별하는 정규식은 올바른 html로 작성 될 수 있지만 더 나쁜 것은 html에도 유효합니다. 예 : <a>quick brown fox</a>과 같은 href 속성이 누락되었습니다. 당신이 기대하는 HTML이 불완전 할 수 있고 당신이 그 이슈들을 다루고 싶다면, 그에 따라 정규 표현식을 수정해야합니다.

희망 사항.

1

대신 키워드를 찾고, 단지 URL에 대한 간단한 경기를하고

+0

은 링크가 존재할 때를 식별하는 두 번째 문제점을 해결하지만 링크가 필요하지만 아직 보유하지 않은 단어는 식별하지 않습니다. – davids

관련 문제