2009-08-18 18 views
1

으로 래핑되지 않은 모든 URL을 매칭합니다. 'a'태그로 래핑되지 않는 HTML의 URL과 일치 할 수있는 정규 표현식 패턴을 찾으려면 'a'태그로 추가로 래핑하십시오. (강조되지 않은 모든 링크를 강조 표시합니다).<a> 태그

입력은 'a', 'b', 'i', 'br', 'p' 'img'태그가 허용되는 단순 HTML입니다. 다른 모든 HTML 태그는 입력에 나타나서는 안되지만 위에 언급 된 태그는 어떤 조합 으로든 나타날 수 있습니다.

그래서 패턴은 기존 'a'태그의 일부인 모든 URL을 생략하고 'a'태그로 래핑되지 않은 평범한 텍스트이며 따라서 강조 표시되지 않고 하이퍼 링크가 아닌 다른 모든 링크와 일치해야합니다. pattern이 http : //, https : // 또는 www.로 시작하고 .net, .com으로 끝나는 URL과 일치하면 좋을 것입니다. 또는 URL이 http : //, https : // 또는 www로 시작하지 않으면 .org.

나는 위에서 설명한 것보다 더 단순한 경우와 일치하도록 '(?! < [aA] [^>] +>) http://[a-zA-Z0-9._-]+ (?!)과 같은 것을 시도했지만이 작업은 그렇지 않은 것 같습니다. 분명한.

도움을 주셔서 감사합니다.

답변

5

BeautifulSoup 또는 유사한 URL을 사용하여 이미 링크의 일부인 모든 URL을 제외 할 수 있습니다.

그러면 일반 텍스트를 이미 URL 정규 표현식 중 하나와 일치시킬 수 있습니다 (google "url regular expression", 원하는 것은 원하는대로 달라집니다).

+1

+1 BeautifulSoup를 제안했습니다. 이 문제는 순수 정규식 솔루션에 적합하지 않습니다. –

5

정규 표현식에 상태가 없으므로 하나의 정규식을 사용하여 HTML을 구문 분석하는 것은 정의가 거의 불가능합니다.

대신 실제 파서를 작성/사용하십시오. 어쩌면 BeautifulSoup 또는 html5lib 일 수 있습니다.

이 코드는 아래 페이지에서 모든 링크를 추출 BeautifulSoup로를 사용

from BeautifulSoup import BeautifulSoup 
from urllib2 import urlopen 

url = 'http://stackoverflow.com/questions/1296778/' 
stream = urlopen(url) 
soup = BeautifulSoup(stream) 
for link in soup.findAll('a'): 
    if link.has_key('href'): 
     print unicode(link.string), '->', link['href'] 

는 마찬가지로 당신이 soup.findAll(text=True)을 사용하는 모든 텍스트를 찾아이 URL을 검색 할 수 있습니다.

URL을 검색하는 것은 매우 복잡합니다. URL에 허용 된 내용을 믿지 않아야합니다. 간단한 검색은 수천 가지 예제를 보여 주지만 정확히 어떤 것도 스펙과 일치하지 않습니다. 당신은 더 잘 작동하는 것을 시도해야합니다.

-2

고마워요! 아래는 내 솔루션입니다.

from django.utils.html import urlize # Yes, I am using Django's urlize to do all dirty work :) 

def urlize_html(value): 
    """ 
    Urlizes text containing simple HTML tags. 
    """ 
    A_IMG_REGEX = r'(<[aA][^>]+>[^<]+</[aA]>|<[iI][mM][gG][^>]+>)' 
    a_img_re = re.compile(A_IMG_REGEX) 

    TAG_REGEX = r'(<[a-zA-Z]+[^>]+>|</[a-zA-Z]>)' 
    tag_re = re.compile(TAG_REGEX) 

    def process(s, p, f): 
     return "".join([c if p.match(c) else f(c) for c in p.split(s)]) 

    def process_urlize(s): 
     return process(s, tag_re, urlize) 

    return process(value, a_img_re, process_urlize) 
+0

나는 이것을 실패하게 만드는 html을 만들기에는 너무 많은 것을 생각할 필요가 없다. – nosklo