2

PHPを使用してチャットクライアントの非常に緩い正規表現一致を実現しようとしています。

チャット クライアントは、完全な URL と不完全な URL の両方を取得できる必要があります。

例えば:

http://www.example.com またはwww.example.comまたはexample.com

これを達成しようとする preg_replace を設定しました。

$find = array("/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/is","/(^(?!http:\/\/)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(\/?\S*)?)/is");
$replace = array( "<a target=\"_blank\" href=\"http://\\1\">\\1</a>","<a target=\"_blank\" href=\"\\1\">\\1</a>");
$output = preg_replace($find, $replace, $input); 

したがって、目的は、最初にプロトコルを使用して「完全な」URL を見つけ、次にプロトコルを持たない「怠惰な」URL を見つけようとすることです。

現在のところ、「完全な」URL では問題なく動作しますが、「遅延」URL は取得されません。

4

2 に答える 2

5

私は少し前に似たようなものを設定しました。私の考えでは...プロトコル識別子または「www」で始まるものはすべてURLであり、パスが続く場合、有効なTLD(2文字または既知のgTLD)で終わるドメインに一致するものはすべてURLです. ドメイン自体は単なるドメインです。

$gtlds="com|net|org|biz|edu|gov|int|pro|xxx";
$gtlds+="|aero|arpa|asia|coop|museum|name|travel";
#$gtlds+="|xn-[a-z0-9]+";
$a = array(
  '/(f|ht)tps?:\/\/[^ ]+/',
  '/(ftp|www)\.[a-z0-9.-]+(/[^ ]*)/',
  "/([a-z0-9][a-z0-9-]*\.)+([a-z]{2}|$gtlds)\/[^ ]*/"
);

私は昔ながらの正規表現のユーザーなので、これは ERE であり、最近すべての子供が使用している凝った PREG のものではないことに注意してください。

gTLD のとてつもなく長いリストはIANAのものです。を除いて、この回答の時点で有効であるように更新しました.XN--*.XN--必要に応じて、パターンを使用するか、それらを直接照合して$gtlds変数を成長させることにより、で始まる TLD のリストを含めることができます。その存在を単に無視することによって引き起こされる問題に遭遇したことがないので、それが私の戦略です.

上記の RE は、私の特定の用途で機能しました。私は、それらが私のものではないすべてのケースで機能するとは主張しません. (たとえば、ドメインまたは URL が引用されている場合、末尾の引用符が含まれます。これは私が対処する必要がなかったため、対処しませんでした。)

置換を行う場合、ジェネレータ アンカーの HREF 属性を一致または生成する URL にしたい場合は、レイアウトと表示の目的で元のテキストをそのまま残したい場合があることに注意してください。

これらをどのように使用するかによって、単語の境界が役立つ場合があります...しかし、それらの方法は既に知っています。

于 2012-06-17T11:42:48.910 に答える
1

それで、それで何時間も苦労した後..私はhttp://URLとwwwの両方を一致させる比較的簡単な方法を見つけることができました。それらをアンカーに変えるためのURL。

これが最終的な解決策です。

$output = preg_replace("/\b((http(s)?:\/\/)?(www\.[a-zA-Z0-9\/\\\:\?\%\.\&\;=#\-\_\!\+\~\,]*))/is","<a target=\"_blank\" href=\"http$3://$4\">$0</a>",$output);

正規表現を提供してくれたtamouseに感謝します。

于 2012-06-18T15:48:48.490 に答える