Когда вы вызываете delete на указателе, выделенном new, вызывается деструктор объекта, на который указывает.
A * p = new A;
delete p; // A:~A() called for you on obkect pointed to by p
Я использовал это на нескольких проектах, я не полагаю, что столкнулся с проблемами, но я уверен, что это не является исчерпывающим:
$text = preg_replace(
'#((https?|ftp)://(\S*?\.\S*?))([\s)\[\]{},;"\':<]|\.\s|$)#i',
"'<a href=\"$1\" target=\"_blank\">$3</a>$4'",
$text
);
большая часть случайного спама в конце должна справиться с ситуациями как http://domain.com.
в предложении (чтобы не соответствовать запаздывающему периоду). Я уверен, что это могло быть очищено, но так как это работало. Я более или менее только что скопировал его от проекта до проекта.
Я использовал этого с хорошим успехом - я не помню, где я получил его от
$pattern = "/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i";
Используйте эти filter_var()
функция, чтобы проверить, является ли строкой URL или нет:
var_dump(filter_var('example.com', FILTER_VALIDATE_URL));
Это - плохая практика для использования регулярных выражений, если не необходимых.
РЕДАКТИРОВАНИЕ : Будьте осторожны, это решение не unicode-безопасно и не XSS-безопасно. При необходимости в сложной проверке возможно, лучше посмотреть где-то в другом месте.
Согласно руководству PHP - parse_url должен не использоваться для проверки URL.
, К сожалению, кажется, что filter_var('example.com', FILTER_VALIDATE_URL)
не работает немного лучше.
И parse_url()
и filter_var()
передаст уродливые URL такой как http://...
Поэтому в этом случае - regex лучший метод.
Редактирование:
Как падение указало, что этот код был УДЕРЖАН ОТ ИСПОЛЬЗОВАНИЯ с выпуском PHP 5.3.0 (2009-06-30) и должен использоваться соответственно.
Просто мои два цента, но я разработал эту функцию и использовал ее некоторое время с успехом. Это хорошо документируется и разделяется так, можно легко изменить его.
// Checks if string is a URL
// @param string $url
// @return bool
function isURL($url = NULL) {
if($url==NULL) return false;
$protocol = '(http://|https://)';
$allowed = '([a-z0-9]([-a-z0-9]*[a-z0-9]+)?)';
$regex = "^". $protocol . // must include the protocol
'(' . $allowed . '{1,63}\.)+'. // 1 or several sub domains with a max of 63 chars
'[a-z]' . '{2,6}'; // followed by a TLD
if(eregi($regex, $url)==true) return true;
else return false;
}
Регулярное выражение Питера мне не кажется правильным по многим причинам. Он позволяет использовать всевозможные специальные символы в доменном имени и не требует особых проверок.
Фрэнки ' s функция мне нравится, и вы можете создать хорошее регулярное выражение из компонентов, если вам не нужна функция, например:
^(http://|https://)(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+[a-z]{2,6}
Непроверено, но я думаю, что это должно работать.
Кроме того, ответ Оуэна не выглядит 100% тоже. Я взял доменную часть регулярного выражения и протестировал ее с помощью инструмента тестера Regex http://erik.eae.net/playground/regexp/regexp.html
Я поместил следующую строку:
(\S*?\.\S*?)
в раздел "регулярное выражение" и следующую строку:
-hello.com
в разделе «образец текста».
Результат допускает прохождение символа минус. Потому что \ S означает любой непробельный символ.
Обратите внимание, что регулярное выражение от Frankie обрабатывает минус, потому что оно содержит эту часть для первого символа:
[a-z0-9]
Что не позволяет использовать минус или другие специальные символы.