@라라 물었다 정규식 대체 <*>를 어떻게 사용할 수 있습니까? 잡는 것에 대해 URL ~에서 HTML . 제안된 세 가지 답변에 대한 자세한 내용은 다음과 같습니다. 첫째, 면책 조항: 이러한 예제 중 어느 것도 HTML 구문 분석의 적절한 작업을 수행하지 않으므로 모두 실제로 존재하지 않는 URL을 찾고 실제로 존재하는 다른 URL을 놓칠 수 있습니다.
/*
THIS IS NOT AN HTML PARSER
HTML parsers are hard to write. There are better ways.
Neither of these JSL ideas can properly skip comments or
many other HTML tags that should be skipped. They will
find things they shouldn't and miss other things they
should find. They've only been minimally tested on one site.
This code is presented as "how can I use contains() vs patmatch()
to efficiently work through a large string looking for something?"
The second example is FIVE TIMES FASTER and a LITTLE MORE ACCURATE.
The third example uses text explorer to grab links. I don't think
there is a pre-existing regex for the link text descriptions. It works
very similar to this code; it is NOT an HTML parser either.
If you can use python, you might want to investigate "beautiful soup".
I've not used it, but believe it addresses the "hard to write" issue.
*/
HTML 구문 분석의 문제는 대부분 일치하는 시작 태그와 종료 태그를 찾고 그 사이의 데이터를 보는 것과 관련이 있습니다. 여기에 제시된 모든 JSL은 HTML 기능에 의해 작동될 수 있습니다. 하지만 충분할 수도 있습니다. 자신의 테스트를 수행하십시오. 참조 아름다운 수프 더 나은 답변이 될 수 있습니다.
다음은 페이지에 표시될 URL(href= 부분)과 약간의 텍스트(토론 부분)가 있는 링크( 태그)를 표시하는 HTML 웹 페이지의 일부입니다.
< a > tag with URL and Text< a > tag with URL and Text< a > tag with URL and Text< a > tag with URL and Text< a > tag with URL and TextURL 및 텍스트가 포함된 < a > 태그
목표는 행당 하나씩 URL 및 링크 텍스트의 데이터 테이블을 만드는 것입니다. 일반적인 웹 페이지에는 100개 정도의 링크가 있고 0.5메가바이트의 텍스트가 있습니다. 하나 느린 문제를 공격하는 방법(표시되지 않음)은 한 번에 하나의 링크를 찾고 텍스트에서 링크를 제거하고 더 이상 찾을 수 없을 때까지 반복하는 간단한 정규식을 작성하는 것입니다. 한두 개만 있으면 훌륭합니다. 하지만 100개가 있을 수 있다면 수백 메가바이트의 데이터가 조작되고 검색됩니다.
더 빠른 방법은 데이터를 검색하는 것입니다. 항상 앞으로 이동하면서 링크가 발견되면 데이터 테이블을 작성합니다. 첫 번째 예는 시작 위치를 지정하는 세 번째 인수가 있는 contains() 함수를 사용합니다. Contains()도 찾은 위치를 반환합니다. 시작 위치를 발견된 위치 바로 너머로 업데이트함으로써 contains()는 텍스트를 백업하거나 수정할 필요 없이 효율적으로 텍스트를 살펴볼 수 있습니다.
u = "https://community.jmp.com/t5/Discussions/bd-p/discussions";
txt = Load Text File( u );
// a link on a page has at least two parts:
// the URL and some descriptive text.
// <A ...="" href="https://community.jmp.com/url" ...="" target="_blank"> descripton </A>
// p1 p4 p5
// using contains and regex. "<A>", p1 + 3 ); // find the end of the opening tag
p5 = Contains( txt, "</A>", p4 + 1 ); // find the ending tag
if( p5 > p4, // as long as the end is not zero, we found one, see break() below
desc = Substr( txt, p4 + 1, p5 - p4 - 1 ); // the visible link description. Images can be here too.
desc = Regex( desc, "<[^>]*>", "", globalreplace ); // remove span, image, etc tags
linktext = Substr( txt, p1, p4 - p1 + 1 ); // <A href="https://community.jmp.com/" target="_blank">
hreftext = Regex( linktext, "href\s*=\s*(\!"|')(.*?)(\1)", "\2" );// use regex to get the href value
if( !Is Missing( hreftext ), // sometimes there isn't one
dt << addrows( 1 );
irow = N Rows( dt );
dt:link[irow] = hreftext;
dt:description[irow] = desc;
);
, // else
Break() // no more end tags. there is maybe a mess of javascript.
);
pos = Max( pos, p5 + 3 ); // advance past the one just found
);
stoptime = Tick Seconds();
dt << endDataUpdate;
Show( stoptime - starttime ); </A>
그 코드의 핵심은 라인입니다
while( (p1 = Contains( txt, "<A></A>
많은 작업을 수행하고 있습니다. 세 번째 인수에 pos를 사용하여 이전 작업을 건너뛰고, 링크 태그를 시작하는 다음 아무것도 찾을 수 없음 , 루프가 중지됩니다. 다음 줄
p4 = Contains( txt, ">", p1 + 3 );
을 검색합니다. p4(의견 참조)는 거기를 가리킵니다. p1+3에서 시작하여 contains()는 이전 항목을 다시 찾지 않고 p1 다음에 하나를 찾습니다. 다음 줄도 비슷합니다. p4 다음에 닫는 태그를 찾습니다.
p5 = Contains( txt, "", p4 + 1 );
p5는 링크 텍스트를 끝내는 태그를 가리킵니다. 전부는 아니지만 많은 HTML 태그가 이와 같이 작동합니다. /가 없는 시작 태그와 슬래시가 있는 종료 태그입니다. 때로는 시작 태그와 끝 태그가 을 사용하여 동일하지만 이 JSL은 그 가능성을 무시합니다.
if 문은 무언가가 발견되었는지 확인하고 발견된 경우 다음과 같은 설명을 선택합니다.
desc = Substr( txt, p4 + 1, p5 - p4 - 1 );
p4와 p5는 >와 <를 가리키고 있습니다. 따라서 p4+1은 첫 번째 설명 문자이고 p5-p4-1은 설명의 길이입니다. 다음 줄은 포함된 태그를 제거하여 설명을 정리합니다.
desc = Regex( desc, "<[^>]*>", "", globalreplace );
GlobalReplace는 정규식이 패턴을 찾고 해당 텍스트를 가능한 한 많이 바꾸지 않음을 의미합니다. 패턴은 <와 일치하고 그 뒤에 >가 아닌 0개 이상의 문자가 오고 그 뒤에 
태그 또는 여러 텍스트 스타일 지정 태그일 수 있는 >가 옵니다. 최종 결과는 그림/색상/글꼴 등이 없는 태그의 텍스트입니다.
다음 두 줄은 설명이 아닌 URL을 가져오기 위해 유사합니다.
p1 및 p4(주석 참조)는 전체 링크 태그 위치입니다. linktext는 다수의 원하지 않는 비트를 포함하는 링크 태그입니다. hreftext는 regex()를 사용하여 href 인용 부호 또는 아포스트로피 사이의 URL만 추출합니다. 정규식 패턴은 역참조 \1을 사용하여 후행 아포스트로피 또는 인용 부호가 선행 부호와 일치하는지 확인합니다. 정규식 패턴의 첫 번째 여는 괄호는 " 또는 '와 일치하는 캡처 그룹(\1용)을 만듭니다. 두 번째 여는 괄호는 일치하는 캡처 그룹(\2용)이며, 마지못해 구분 기호 사이에서 일치하는 데 필요한 만큼 앞으로 이동합니다. 세 번째 여는 괄호는 캡처 그룹 3입니다. 괄호와 그룹화는 실제로 필요하지 않습니다. 결과 \2는 URL일 뿐입니다.
Max는 마지막에 뒤로 돌아가서 루프에 빠지지 않도록 합니다.
위의 코드는 매우 빠르지만 훨씬 더 좋습니다.