こちらの環境で実行したところ、2つのエラーがでましたので、その2つの解決方法を書いておきますので、ぜひ参考にしてください。
1つ目
Notice: Undefined variable: msg in [PHPファイルのパス] on line 5
まずこちらのNoticeレベルのエラー。
英語ですが、単語ごとに適当に訳していくと以下のようになります。
Undefined(未定義) variable(変数):msg in [PHPファイルのパス] on line(行) 5
つまりこのエラーは「msgっていう変数が未定義だよ!」と言っているわけです。
質問者さんのコードですと、msgは定義されていません(smgという変数なら定義されているが)。
というわけでmsg変数を定義してみると、コードはしたのようになります。
PHP
1<?php
2$msg = <<<EOD
3サンプルは、「サーバサイド技術の学び舎 (http:wings.msn.to)」から入手できます。執筆のノウハウ集「WINGS knowledge」(http:www31.atwiki.jp/wingsproject)もどうぞ。
4EOD;
5print preg_replace('|http(S)?://([\w-]+\.)+[\w-]+(/[w- ./?%&=]*?|', '<a href="$0">$0</a>', $msg);
これでNoticeエラーは消えました。
2つ目
Warning: preg_replace(): Compilation failed: range out of order in character class at offset 33 in [PHPファイルのパス] on line 5
次のエラーはWarningレベルのエラーのこれ。
エラーの文をみると、5行目で発生しています。5行目は、正規表現により文字列の中のURLらしき文字列を自動でリンクに変えるということを行う部分です。この部分でpreg_replace()に関するエラーが出ているということは正規表現にミスがあることが第一に考えられます。
というわけで、正規表現の部分を見てみると、おそらく違うであろう部分を複数みつけたので以下に比較として私が書いたものと質問者さんのものを並べて書いておきますので、参考までに。
|http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?|
|http(S)?://([\w-]+\.)+[\w-]+(/[w- ./?%&=]*?|//こちらが質問者さんのものです
結果としては、これを直したら無事このエラーも直りました。
最後に、正規表現に関するサイトを載せておきますので、参考にみてみると良いかもしれません。
正規表現入門(ドットインストール)