2009-07-13 6 views
0

저는 지금 당장 정규 표현식 기술을 향상시키고 싶었습니다. "Mastering Regular Expressions"는 꽤 많이 추천 받았고 그래서 나는 그것을 사서 하루 종일 읽었습니다. . 처음 두 링크를 일치하지만, <i> 태그로 둘러싸인이 무시정규식 기술 향상

^(?:<b>)?(?:^<i>)?<a href="/site\.php\?id=([0-9]*)">(.*?) \(([ a-z0-9]{2,10})\)</a>(?:^</i>)?(?:</b>)?$ 

:

나는 다음과 같은 정규 표현식을 만들었습니다. id, title 및 type을 추출합니다.

<a href="/site.php?id=6321">site 1 title (type 1)</a> 
<b><a href="/site.php?id=10254">site 2 title (type 2)</a></b> 

<i><a href="/site.php?id=5479">site 3 title (type 3)</a></i> 
<b><i><a href="/site.php?id=325">site 4 title (type 4)</a></i></b> 

효과가 있긴하지만 너무 단순하기 때문에 오래 사용할 수 있습니까?

+0

몇 가지를 어떻게 그것이 유형과 일치합니까? 그것은 괄호에있는 형식 이외의 단어와 일치하는 것 같습니다. 또한 "(여기 정상적인 내용)"<----와 같이 일치하는 태그가 없으므로 태그를 찾을 수 있습니다. 또한 이드가 비어 있기를 원합니까? ie - "id ="? – Tom

+0

당신은 (? :) 그 사실을 알고 있습니까? (? : )?의 "메모리"가 없습니다. 실제로, 첫 번째 것이 나타나는 경우에만 두 번째 것을 원할 것입니다. 공식적으로 말하자면, 정규 표현식은 이것을 처리 할 수 ​​없습니다. 특정 프로그래밍 언어에서 정규식 확장을 처리 할 수는 있지만 (정규식이라고 부른다고 생각합니다.하지만 regexes가 할 수있는 것은 아닙니다). – Tom

+0

지금은 위의 예제와 일치시키고 싶습니다. 당신은 엔딩 태그에 대해 옳았고 그것을 만들 때 마음에 왔습니다. 또한, 형식 부분은 숫자뿐만 아니라 형식 뒤에 어떤 것도 포함 할 수 있습니다. – DanCake

답변

1

Whilliham으로 작성한 스크린 스크래퍼가 HTML을 정규 표현식으로 사용하기에 적합한 파서일지도 모릅니다.

  • 은 문자열과 문자열 검사의 끝의 시작, 당신은 정말 그들

    이 훨씬 단축하지하지만 조금 정규식 더 관대 필요 않았다 제거됨

    ?
  • 제외 lookbehind 만들기 위해 반드시 <a> 대신에 [0-9] TAD 청소기 \ D 간단한 asertation의 <i>
  • 이용하여 덧붙일 아니다.
  • 3에서 11 자까지 입력했는데 3 자 이상으로 변경했습니다.
  • 제거됨 종료 태그가 있는지 검사하여 스크린 크래프 (아마도)에 문맥 적 의미가 없습니다.

(?<!<i>)<a href="/site.php\?id=(\d*)">(.*?) \(([ a-z\d]{2,})\)

+0

감사합니다. 정말 도움이되었습니다. Lookaheads와 Lookbehinds를 편리하게 보일 것입니다. – DanCake

5

문자 클래스 (0-9 등의 경우 \ d)를 사용하지 않아도 문제의 정규 표현식이 많이 단축 될 수는 없다는 것을 알았습니다. 그러나 ...

부수적으로 정규 표현식으로 HTML 구문 분석이 위험하다는 것을 언급 할 가치가 있습니다. HTML (그리고 그보다는 덜 XML)을 다루는 경우 DOM 도구가 일반적으로 더 적합합니다.

+0

위험 할뿐만 아니라 ... 정말로 틀린 ... 정규 표현식은 문맥을 구분하지 않기 때문에 html을 다루기 위해 설계되지 않았습니다. 나쁜 +1이라고 지적하는 +1. – Tom

+0

이렇게 많은 질문이 있습니다. 어떻게 그들을 알려주는거야? 자주 묻는 질문을 만드시겠습니까? lol – Victor

+0

@ 빅터 : 알고 싶습니다.문제의 일부는 정규식이라는 용어가 남용 된 것입니다. 매우 많은 변형과 확장 기능이있어 정규 표현식을 더욱 강력하게 만드는 언어에 의해 추가되었습니다. 사람들이 모든 파싱 문제에 대한 해결책이라고 생각합니다. 때로는 html로 (데이터에 대한 특정 가정을한다면) html로 빠르고 지저분한 것들을 할 수 있습니다.하지만 여전히 사람들이 사용하지 않아야한다는 사실을 우연히 발견 할 수있는 쉬운 방법이 있었으면합니다. 문맥에 민감한 문법을 ​​파싱합니다. – Tom