2011-01-25 4 views
3

Я использую VB.NET и хочу добавить http:// ко всем ссылкам, которые еще не начинаются с http: //, https: //, ftp: // и скоро.Добавление 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 самостоятельно, это синтаксический анализ и догадки, с которыми у меня возникают проблемы. Может ли кто-нибудь дать мне пример с Regex.Replace() в C# или VB.NET?

Любая помощь оценена!

+1

Хммм ... и как здесь? 'on this site' – Piskvor

+0

Что вы будете делать, если вы ссылаетесь на местный сайт? Как Home EDIT: Слишком поздно ... –

+0

В этом конкретном случае это не имеет значения, но спасибо за указание. –

ответ

1

Цитата RFC 1738:

«имена Схема состоит из последовательности символов строчные буквы.„А“-» г «цифры и символы плюс („+“), период (» . »), и дефис (« - ») разрешены. Для отказоустойчивости программы, интерпретирующие URL-адреса, должны обрабатывать буквы верхнего регистра как эквивалентные нижнему регистру в именах схем (например, разрешать« HTTP », а также« http »)».

Отлично! Регулярное выражение для соответствия:

/^[a-zA-Z0-9+.-]+:\/\// 

Если это соответствует вашей строке href, продолжайте движение. Если нет, добавьте «http: //». Остальные проверки на работоспособность принадлежат вам, если вы не запрашиваете конкретные данные. Обратите внимание на мысли других комментаторов относительно относительных ссылок.


EDIT: Я начинаю подозревать, что вы задали неправильный вопрос ... что вы, возможно, не имеют ничего, что разделяет текст вверх на отдельные лексемы, которые необходимо обработать. См Looking for C# HTML parser


EDIT: Как слепой попытки на игнорирование всех и просто атакуют текст, используя регистрозависимости соответствия,

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

Если вторая обратная ссылка соответствует /^[a-zA-Z0-9+.-]+:\/\//, ничего не делать. Если он не совпадает, замените его

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

Это не синтаксис C#, но он должен перевести через без особых усилий.

+0

Я получил это далеко, это разбор и догадки, с которыми у меня возникают проблемы. Не могли бы вы привести пример с Regex.Replace()? –

+0

'url =" http: // "+ url;' будет намного проще, чем замена регулярных выражений. –

+0

@EDIT Это правильно, у меня нет ничего, что разбивает текст. Наверное, я посмотрю на парсеры HTML, но они казались немного тяжелыми, чтобы добавить http: // к ссылкам. Спасибо :) –

0

Если вы не связаны с потенциально портя местные ссылки, и вы всегда можете гарантировать, что строки будут полностью доменными именами, то вы можете просто использовать содержит метод:

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 

Хранить в помните, что это исключает много явлений, касающихся проверки того, какой протокол следует использовать в добавлении, и если URL-адрес относительный или нет.

Редактировать: Я выбрал специально, чтобы не предлагать решение RegEx, поскольку это простая проверка, и RegEx немного тяжел для нее (IMO).

+0

Спасибо, но у меня нет никаких проблем с одним URL. Я хочу проанализировать более длинный текст с несколькими ссылками. –

1

В PHP (следует перевести несколько легко)

$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"); 
Смежные вопросы