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

ользую VB.NET и хотел бы добавитьhttp:// ко всем ссылкам, которые еще не начинаются с http: //, https: //, ftp: // и так далее.

"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?

Любая помощь приветствуется!

 Shad01 мар. 2011 г., 23:36
+1 У меня есть именно эта проблема ...
 Magnus Engdal25 янв. 2011 г., 13:10
В данном конкретном случае это не имеет значения, но спасибо за указание на это.
 Piskvor25 янв. 2011 г., 13:01
Хм ... а как тут?<a href="/relative/path">on this site</a>
 Jan Sverre25 янв. 2011 г., 13:02
Что вы будете делать, если вы ссылаетесь на локальный сайт? Например, <a href="Home.aspx"> На главную </a> РЕДАКТИРОВАТЬ: слишком поздно ...

Ответы на вопрос(4)

C #

 result = new Regex("(href=\")([^(http|https|ftp)])", RegexOptions.IgnoreCase).Replace(input, "href=\"//$2");
Решение Вопроса

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

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

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

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

РЕДАКТИРОВАТЬ: я начинаю подозревать, что вы задали неправильный вопрос ... что у вас, возможно, нет ничего, что разбивает текст на отдельные токены, которые вам нужны для обработки. ВидетьИщу C # HTML парсер

РЕДАКТИРОВАТЬ: как слепой попытаться игнорировать все и просто атаковать текст, используя регистронезависимое соответствие,

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

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

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

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

 Magnus Engdal25 янв. 2011 г., 13:26
Я получил это далеко, это разбор и предпросмотр, с которыми у меня проблемы. Не могли бы вы привести пример с Regex.Replace ()?
 Charlie Gorichanaz16 окт. 2013 г., 22:33
Также следует учитывать, что вы можете не захотеть добавлятьhttp:// на ссылку, начинающуюся с//
 Magnus Engdal25 янв. 2011 г., 14:01
@ EDIT Это правильно, у меня нет ничего, что разбивает текст. Я думаю, что я взгляну на HTML-парсеры, но они казались немного тяжелыми только для добавления http: // к ссылкам. Спасибо :)
 Jeff Ferland25 янв. 2011 г., 14:14
Дал вам решение регулярного выражения, но я не даю никаких обещаний, что оно ведет себя хорошо.
 Jeff Ferland25 янв. 2011 г., 13:39
url = "http://" + url; было бы намного проще, чем замена регулярных выражений.

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

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).

 Magnus Engdal25 янв. 2011 г., 13:22
Спасибо, но у меня нет проблем с одним URL. Я хочу разобрать более длинный текст с несколькими ссылками.

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

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

Ваш ответ на вопрос