0

次のパターンを使用してリンクをキャプチャし、それらを HTML 対応のリンクに変換しています。preg_replace_callback で次のパターンを使用しますが、ほとんどの場合は機能します。

"#(https?|ftp)://(\S+[^\s.,>)\];'\"!?])#"

しかし、テキストが次のようになっている場合、このパターンは失敗します。

http://mylink.com/page[/b]

その時点で、リンクの一部である [/b を面白がってキャプチャし、次のようになります。

<a href="http://woodmill.co.uk[/b">woodmill.co.uk[/b</a>]

私はパターンに目を通し、チートシートを使用して何が起こっているのかを追跡しようとしましたが、それは私を悩ませました. 忍者のヘルプをコーディングできる人はいますか?

4

2 に答える 2

0

わかりました私は問題を解決しました。@Cyborgx37 と @MikeBrant の助けに感謝します。これが解決策です。

まず、正規表現パターンを João Castro がこの質問で使用したパターンに置き換えました: Making a url regex global

そのパターンの問題は、最後に末尾のドットがキャプチャされることです。そのため、パターンの最後のセクションで、^.最後の部分が so のように見えるように追加しました[^\s^.]。私が読んだように、末尾のスペースやドットと一致しないでください。

これにより、前述のように bbcode に一致する問題が引き続き発生するため、preg_replace_callback() と create_function() を使用して除外しました。最終的な create_function() は次のようになります。

create_function('$match','
                $match[0] = preg_replace("/\[\/?(.*?)\]/", "", $match[0]);
                $match[0] = preg_replace("/\<\/?(.*?)\>/", "", $match[0]);
                $m = trim(strtolower($match[0]));
                $m = str_replace("http://", "", $m);
                $m = str_replace("https://", "", $m);
                $m = str_replace("ftp://", "", $m);
                $m = str_replace("www.", "", $m);

                if (strlen($m) > 25)
                {
                    $m = substr($m, 0, 25) . "...";
                }

                return "<a href=\"$match[0]\" target=\"_blank\">$m</a>";
'), $string);

これまでのテストは順調に進んでいるので、問題が解決したことをうれしく思います。

もう一度ありがとう、そしてこれが他の誰かに役立つことを願っています:)

于 2013-01-22T02:26:44.220 に答える
0

文字クラスに開き角括弧を追加してみてください。

(\S+[^\s.,>)[\];'\"!?])
            ^

アップデート

次のより効果的な URL 正規表現を試してください。

^(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w \.-]*)*/?$

(出典: http://net.tutsplus.com/tutorials/other/8-regular-expressions-you-should-know/ )

私は PHP の正規表現を直接扱った経験はありませんが、上記は単純で汎用的なものなので、問題はないと思います。現在の正規表現のように、ドメインだけを抽出するように変更することができます。

于 2013-01-19T02:29:09.897 に答える