>source

정규식이 있고 링크 ()를 만드는 모든 URL을 찾으려고하지만 다음과 같은 문제가 있습니다.

  • "\ foo \ bar"가있는 일부 URL이 가져 오지 않습니다.
  • URL은 웹의 일부로 사용합니다.

www.foo.com->https://mywebsite.com/section/www.foo.com

https가없는 링크 인 경우 자동으로 배치 될 수 있습니다 (ftp 또는 \ 호스트 이름 또는 \ ip 제외) ???

감사 !

라이브 정규식 : https://regex101.com/r/w3o9w1/1

정규식 :

/(?:(?:https?|ftp|):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?/gm

텍스트 데모 :

text www.example.com  text text text http://example.com 
\\hadgs01\test2
http://192.168.1.1:3000/
192.168.1.1:3000
\\192.168.10.10\test\test.txt
http://example.com
http://example.gl
http://www.example.com
https://example.com
https://www.example.com
https://www.example.com/
https://www.example.com/bar
https://example.com/icons?d=bar&q=bar
http://abc.dec.ed.example.com
http://example.gl/1 http://example.gl/2
foo (http://example.gl/1) http://example.gl/(2)
http://example.com/. http://example.com/! http://example.com/,
example.gl/1
http://example.com/review/abc-def-ghi/?ct=t(test_test_bar)

www.example.com.au
http://www.example.com.au
http://www.example.com.au/ersdfs
http://www.example.com.au/bar?dfd=test@s=1
http://www.example.com:81/bar.html

암호:

var regex_links = /(?:(?:https?|ftp):\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?/gm;
$(".text_to_replace").html($(".text_to_replace").html().replace(regex_links, " <a href=\"$&\" target='_blank'>$&</a> "));


  • 답변 # 1

    귀하의 정규식은 귀하의 기대에 매우 가깝습니다. 그러나 귀하의 요구 사항에 대한 문자열을 일치시키기 위해 ("\\ hadgs01 \ test2"또는 "\\ 192.168.10.10 \ test \ test.txt"와 일치) 아래 정규식을 사용할 수 있습니다.

    (?:(https?|ftp)?:?\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?
    
    

    정규식에서 변경된 사항 :

    (?:https?|ftp|): 로 변경 (https?|ftp|)?:? -두 번째 요구 사항에 대한 그룹을 캡처하고 원하는 정렬 문자열과 일치시키기 위해 정규식을 다음과 같이 수정했습니다. \\hadgs01\test2\\192.168.10.10\test\test.txt .

    JAVASCRIPT에서 구현 :

    const myRegexp = /(?:(https?|ftp)?:?\/\/|\b(?:[a-z\d]+\.))(?:(?:[^\s()<>]+|\((?:[^\s()<>]+|(?:\([^\s()<>]+\)))?\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))?\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))?/gm;
    const myString = `
    text www.example.com  text text text http://example.com 
    //hadgs01/test2
    http://192.168.1.1:3000/
    192.168.1.1:3000
    \\\\192.168.10.10\\test\\test.txt
    http://example.com
    http://examp.ele
    http://www.example.com
    https://example.com
    https://www.example.com
    https://www.example.com/
    https://www.example.com/bar
    https://example.com/icons?d=bar&q=bar
    http://abc.dec.ed.example.com
    http://examp.le/1 http://examp.ele/2
    foo (http://examp.ele/1) http://examp.ele/(2)
    http://example.com/. http://example.com/! http://example.com/,
    examp.le/1
    http://example.com/review/abc-def-ghi/?ct=t(test_test_bar)
    www.example.com.au
    http://www.example.com.au
    http://www.example.com.au/ersdfs
    http://www.example.com.au/bar?dfd=test@s=1
    http://www.example.com:81/bar.html
    \\ example \\\\
    `;
    // PLEASE NOTE I REPLACED FOO and goo.gle from the string to example and examp.ele because of the norms
    let match;
    // Taken the below variable to store the result
    let resultString = "";
    match = myRegexp.exec(myString);
    while (match != null) {
    // If group 1 of match is null that means it does'nt contain anything among https, http or ftp but it match rest of the requirement.
      if(match[1] == null)
      // If in case the link already contains slashes like //hadgs01/test2
        if(match[0].includes('//'))
          resultString = resultString.concat("https:" + match[0] + "\n");
        else
          resultString = resultString.concat("https://" + match[0] + "\n");
      else
        resultString = resultString.concat(match[0] + "\n");
      
      match = myRegexp.exec(myString);
    }
    console.log(resultString);
    
    

  • 이전 orgopenqaseleniumwebdriverexception - 원격 응답을 구문 분석 할 수 없음 :
  • 다음 javascript - 배열 변수 ng-repeat를 사용한 Angular JS Rendering