2011-01-25 5 views
3

VB.NET을 사용하여 http : //, https : //, ftp : //로 시작하지 않는 모든 링크에 http://을 추가하고 싶습니다. 곧.프로토콜없이 모든 링크에 http : // 추가

"I want to add http here <a href=""www.google.com"" target=""_blank"">Google</a>, 
but not here <a href=""http://www.google.com"" target=""_blank"">Google</a>." 

방금 ​​링크가 있었지만 여러 링크가 포함 된 전체 문자열에 대한 좋은 해결책을 찾을 수 없었습니다. RegEx가 갈 길이 멀지 만, 어디서부터 시작해야할지 모를 것입니다.

RegEx를 직접 찾을 수 있습니다. 문제가있는 구문 분석 및 추가 작업입니다. 누구든지 C# 또는 VB.NET에서 Regex.Replace()를 사용하여 예제를 제공 할 수 있습니까?

도움을 주셨습니다.

+1

흠 ... 어떻게 여기에 대해? 'on this site' – Piskvor

+0

로컬 사이트를 참조하는 경우 어떻게 할 것입니까? 마찬가지로 Home 편집 : 너무 늦었습니다 ... –

+0

이 특별한 경우에는 문제가되지 않지만 그것을 지적 해 주셔서 감사합니다. –

답변

1

견적 RFC 1738 :

"반응식 이름 문자 시퀀스 구성 소문자."A "-"Z ", 숫자 및 문자 플러스 ("+ "), 기간 ("), 하이픈 ("-")이 허용됩니다. 복원력을 위해 URL을 해석하는 프로그램은 대문자를 스키마 이름의 소문자와 동일하게 취급해야합니다 (예 : "HTTP"및 "http"허용).

우수! 일치하는 정규식 :

href 문자열과 일치하는 경우 계속하십시오. 그렇지 않은 경우 앞에 "http : //"를 입력하십시오. 특정 세부 사항을 요구하지 않는 한 잔여 정신 체크는 당신 것입니다. 상대 링크에 대한 다른 의견 작성자의 생각에 주목하십시오.


편집 : 내가 잘못된 질문을 한 것을 ... 당신은 아마 당신이 그것을 처리 할 필요가 개별 토큰으로 텍스트까지 분할 아무것도하지 않는 것을 의심하기 시작 했어. Looking for C# HTML parser


편집을 참조하십시오 : 대소 문자를 구분 일치를 사용하여, 모두를 무시하고 텍스트 만 공격에서 블라인드 시도,

/(<a +href *= *")(.*?)(" *>)/ 

두 번째 백 참조 /^[a-zA-Z0-9+.-]+:\/\// 일치하는 경우로, 아무것도하지 않습니다. 일치하지 않을 경우,이 C#을 구문 아니다

$1 + "http://" + $2 + $3 

로 교체,하지만 너무 많은 노력을하지 않고에서 번역해야한다.

Dim myUrl as string = "someUrlString".ToLower() 

If Not myUrl.Contains("http://") AndAlso Not myUrl.Contains("https://") AndAlso Not myUrl.Contains("ftp://") Then 

    'Execute your logic to prepend the proper protocol 
    myUrl = "http://" & myUrl 

End If 

에 보관 : 당신이 잠재적으로 지역의 링크를 엉망으로, 당신은 항상 문자열 정규화 된 도메인 이름이 될 것이라는 점을 보장 할 수와 관련되지 않은 경우

+0

나는 이걸 가지고 있는데, 파싱과 내가 문제를 일으키는 것입니다. Regex.Replace()를 사용하여 예를 들어 주시겠습니까? –

+0

'url = "http : //"+ url;'은 정규 표현식을 대체하는 것보다 훨씬 간단합니다. –

+0

@ EDIT 맞습니다. 텍스트를 나눌만한 것이 없습니다. HTML 파서를 살펴볼 것 같지만 http : //를 링크 앞에 붙이는 것만으로도 무거워 보였다. 감사합니다 :) –

0

는, 당신은 단순히이 방법이 포함되어 사용할 수 있습니다 마음은 추가에 어떤 프로토콜이 사용되어야하는지, 그리고 URL이 상대적인지 여부와 관련하여 많은 구멍을 생략합니다.

편집 : RegEx 솔루션을 제공하지 않기로 선택했습니다. RegEx 솔루션은 간단한 체크이며 RegEx는 약간 무겁습니다 (IMO).PHP에서

+0

감사합니다. 단 하나의 URL에는 아무런 문제가 없습니다. 여러 링크가있는 긴 텍스트를 구문 분석하고 싶습니다. –

1

는 (다소 쉽게 번역한다)

$text = preg_replace('/href="(?:(http|ftp|https)\:\/\/)?([^"]*)"/', 'href="http://$1"', $text); 
1

C#

result = new Regex("(href=\")([^(http|https|ftp)])", RegexOptions.IgnoreCase).Replace(input, "href=\"//$2"); 
관련 문제