Трудно заставить почту работать на локальном хосте по разным причинам, которые включают в себя неправильную настройку SMTP-сервера.
Я бы предложил сначала протестировать с sendmail и проверить, работает ли он - если это не сработает, то я бы предложил перейти к тестированию локального SMTP-сервера с помощью telnet. Возможно, у вас проблемы с сетью, из-за которых необходимые порты недоступны из-за вашего интернет-провайдера. Насколько я знаю, некоторые интернет-провайдеры блокируют эти порты специально, чтобы помочь уменьшить спам.
Одним из возможных решений может быть настройка PHP для использования внешнего SMTP-сервера, такого как Google, через файл конфигурации php (php.ini).
Лучшее решение, на мой взгляд, это получить общий хостинг или VPS и использовать его для разработки.
Ну, теоретически Вы правы, это не должно соответствовать. Но это зависит от того, как реализация работает внутренне. Большая часть regex impl. возьмет Ваш regex и разделит ^ от передней стороны (обращение внимания, которому это должно соответствовать от запуска строки) и $ полосы от конца (замечание, что это должно в конец строки), что перенесено, просто "*", и "*" самостоятельно допустимый regex. Реализация, которую Вы используете, просто неправильно расценивает, как обработать ее. Вы могли попробовать то, что происходит, если Вы заменяете "^* $" только с "*"; я предполагаю, что это будет также соответствовать всему. Это походит на обработки реализации единственная звездочка как a ".*".
Согласно ISO/IEC 9945-2:1993 стандарт, который также описан в стандарте POSIX, он повреждается. Это повреждается, потому что в стандарте говорится, что после ^ символа, звездочка не имеет никакого особого значения вообще. Это означает "^*, $" должен на самом деле только соответствовать единственной строке, и эта строка "*"!
Заключить стандарт в кавычки:
Звездочка является особенной кроме тех случаев, когда используемый:
- в выражении скобки
- как первый символ всего BRE (после начальной буквы ^, если таковые имеются)
- как первый символ подвыражения (после начальной буквы ^, если таковые имеются); см., что BREs Соответствует Нескольким Символам.
Таким образом, если это - первый символ (и ^ не рассчитывает как первый символ, если существующий) это не имеет никакого особого значения. Это означает в этом случае, что звездочка должна только соответствовать одному символу, и это - звездочка.
Microsoft заявляет
Регулярные выражения Microsoft.NET Framework включают самые популярные функции других реализаций регулярного выражения, такие как те, которые в Perl и awk. Разработанный, чтобы быть совместимыми с Perl 5 регулярных выражений, регулярные выражения Платформы.NET включают функции, еще не замеченные в других реализациях, таких как справа налево соответствие и непрерывная компиляция.
Источник: http://msdn.microsoft.com/en-us/library/hs600312.aspx
Хорошо, давайте протестируем это:
# echo -n 127.0.0.1 | perl -n -e 'print (($_ =~ m/(^.*$)/)[0]),"\n";'
-> 127.0.0.1
# echo -n 127.0.0.1 | perl -n -e 'print (($_ =~ m/(^*$)/)[0]),"\n";'
->
Нет, это не делает. Perl работает правильно. ^.* $ соответствует строке, ^* $ не делает =>, regex реализация.NET повреждается, и это не работает как Perl 5 требованиями MS.
Звездочка (*) соответствует предыдущему НУЛЮ элемента ИЛИ БОЛЬШЕ раз. Если Вы хотите один или несколько, используйте + оператор вместо *.
Вы просите, чтобы это соответствовало дополнительному запуску строкового маркера и концу строкового маркера. Т.е. если мы опускаем запуск строкового маркера, Вы только ищете конец строкового маркера..., который будет соответствовать любой строке!
Я действительно не понимаю то, что Вы пытаетесь сделать. Если Вы могли бы дать нам больше информации затем, возможно, я мог бы сказать Вам, что необходимо было сделать :)
Если Вы пробуете
Regex.Match("127.0.0.1", "^*1$")
Вы будете видеть, что это также соответствует. Соответствие. Индексное свойство имеет значение 8, означая, что оно соответствовало последнему '1', не первое. Это имеет смысл, потому что "^*" будет соответствовать нулю или больше начала строк и существует нулевое начало строки прежде '1'.
Думайте о пути "a*1, $" соответствовал бы, потому что существует не перед "1$". Так "a* $" соответствовал бы концу строки, как Ваш пример делает.
Между прочим, документы MSDN не упоминают '*' никогда соответствие просто '*' кроме тех случаев, когда завершенный как '\* '. И '*' отдельно будет выдавать исключение, не соответствовать'* '.
Вы эффективно говорите, "соответствуют строке, которая не содержит ничего или чего-либо". Таким образом, это собирается соответствовать. ^ и привязка $ действительно не имеют значения в этом случае.
Используя RegexDesigner, я вижу, что он соответствует на 'пустом' маркере после '127.0.0.1'. Кажется, что, потому что Вы не указали маркер и плюс нуль соответствий или больше раз, он соответствует на 'пустом' маркере.
Следующий regex должен работать:
^+$
POSIX regex стандарт действительно стар и ограничен. Несколько инструментов, который все еще следует за ним сегодня, такие как grep, sed и друзья, находятся главным образом на оболочке unix/linux. Perl и PCRE два, очень расширенные разновидности, в которых все еще не сохраняется почти ничто упомянутое в стандарте POSIX.
http://www.regular-expressions.info/refflavors.html
В PCRE и Perl, обработках механизма ^
и $
как маркеры, которые соответствуют началу и концу строки (или строка, если многострочный флаг установлен). *
просто повторения ^
нуль маркера или больше раз (в этом случае, точно нулевые времена). Механизм таким образом только ищет конец исходной строки, которая соответствует любой строке.
Недопустимый regexp независимо, что Вы хотите записать, наиболее вероятен не это.
Вы пишете: "$ ^* должен соответствовать началу строки/строки любое количество раз, сопровождаемое окончанием строки/строки", которая подразумевает, что Вы хотите мультилинию regexps, но Вы забываете, что строка не может запуститься дважды без промежутка конца строки.
Кроме того, что Вы спрашиваете в своих требованиях, на самом деле соответствует "127.0.0.1" :) "^" не является переводом строки / возврат каретки, но также и начинание строки, и "$" не является просто новой строкой, но и концом строки.
Кроме того, "* "s соответствуют как можно больше (кроме тех случаев, когда нежадный режим установлен), что означает что regexp/^. ** $ / regexp будет соответствовать всему. Если Вы хотите управлять новыми строками, необходимо кодировать их явно.
Надежда это разъясняет что-то :)