Data Hygiene - это постоянная битва. Правильный случай никогда не бывает таким простым, как можно подумать. Существуют многочисленные различия и несоответствия при использовании данных из дикой природы.
Вот функция, которая может быть расширена при необходимости.
Полное раскрытие: Есть много других более производительных функций, но они, как правило, имеют упрощенный подход.
Пример
Declare @YourTable table (SomeCol varchar(100))
Insert Into @YourTable values
('old mcdonald'),
('dr. Langdon ,dds'),
('b&o railroad'),
('john-m-smith'),
('CARSON/jACOBS'),
('jAmes o''neil')
Select *
,ProperCase = [dbo].[svf-Str-Proper](SomeCol)
From @YourTable
Возвращает
SomeCol ProperCase
old mcdonald Old McDonald
dr. Langdon ,dds Dr. Langdon ,DDS
b&o railroad B&O Railroad
john-m-smith John-M-Smith
CARSON/jACOBS Carson/Jacobs
jAmes o'neil James O'Neil
UDF, если интересно
[112 ]Я хотел бы указать, что, если Вы находитесь на so.com, следующими ссылками являются URL в том же домене:
(это может казаться нечетным, но последние два допустимы: если бы Вы находитесь на http://so.com, последний взял бы Вас на http://so.com/mail.google.com/index.php?var=value, который совершенно действителен),
Это действительно не отвечает на вопрос, но я надеюсь, что он будет вести остальную часть ответов. Если существует что-либо еще достаточно странное, не стесняйтесь добавлять его.
Возможно, это поможет: http://www.quirksmode.org/js/events_properties.html#target
Это походит на ответ комедии, но во всей серьезности это было бы быть желательным, чтобы Вы могли также сделать что-то как:
$('a.external')
Конечно, regex сравнение с Вашим window.location является программным ответом.
Метод вложения не является единственным способом, которым отличаются слушатели события IE и W3. Для IE необходимо считать window.event.srcElement; в W3 это - event.target, где событие является параметром, переданным функции обратного вызова.
Если Вам не нужны несколько обработчиков событий на ссылках, олдскульный DOM, 0 обработчиков событий являются, вероятно, более легким способом для Вас приблизиться к этому, позволяя Вам просто нам 'это' получать объект на любом браузере.
function bindtolinks() {
for (var i= document.links.length; i-->0;)
document.links.onclick= clicklink;
}
function clicklink() {
if (this.host==window.location.host) {
dosomething();
return true; // I'm an internal link. Follow me.
} else {
dosomethingelse();
return false; // I'm an external link. Don't follow, only do something else.
}
}
if( someDomElementWhichIsALink.href.indexOf(window.location) != -1 ) {
// this is targeting your domain
}
Я отвечу на вопрос в обновлении о событиях в IE:
function track_file(evt)
{
if (evt == undefined)
{
evt = window.event; // For IE
}
// Use evt
}
классический путь состоит в том, чтобы получить последовательный объект-событие через браузеры.
После этого я использовал бы regexes для нормализации URL, но я не уверен, о чем Вы заботитесь.
[РЕДАКТИРОВАНИЕ] Некоторый реальный код для помещения на практике, что я записал выше... :-)
function CheckTarget(evt)
{
if (evt == undefined)
{
// For IE
evt = window.event;
//~ event.returnValue = false;
var target = evt.srcElement;
var console = { log: alert };
}
else
{
target = evt.target;
//~ preventDefault();
}
alert(target.hostname + " vs. " + window.location.hostname);
var re = /^https?:\/\/[\w.-]*?([\w-]+\.[a-z]+)\/.*$/;
var strippedURL = window.location.href.match(re);
if (strippedURL == null)
{
// Oops! (?)
alert("Where are we?");
return false;
}
alert(window.location.href + " => " + strippedURL);
var strippedTarget = target.href.match(re);
if (strippedTarget == null)
{
// Oops! (?)
alert("What is it?");
return false;
}
alert(target + " => " + strippedTarget);
if (strippedURL[1] == strippedTarget[1])
{
//~ window.location.href = target.href; // Go there
return true; // Accept the jump
}
return false;
}
Это - тестовый код, не производственный код, очевидно!
Строки с//~ комментарии показывают альтернативный способ предотвратить щелчок по ссылке, чтобы сделать переход. Это, так или иначе, более эффективно, потому что, если я использую console.log Firebug, любопытно ложь возврата неэффективна.
Я использовал здесь поведение, "переходят по ссылке или не", не зная реальной заключительной цели.
Как указано в комментариях, РЕ может быть более простым при помощи имени хоста вместо href... Я уезжаю как он, потому что это было уже кодировано и могло бы быть полезно в других случаях.
Некоторые специальные меры предосторожности должны быть приняты в обоих случаях для обработки особых случаев, как localhost, IP-адреса, порты...
Я избавился от доменного имени, прежде, чем перечитать вопрос и видеть, что это не была проблема... Ну, возможно, это может быть полезно для кого-то еще.
Примечание: Я показанный аналогичное решение в вопросе украсить ссылки: Редактирование всех внешних ссылок с JavaScript