2

次の正規表現:

$common_tlds = 'us|me|com|net|org|ly|be|edu|gov|uk|ca|de|jp|fr|au|ru|ch|it|nl|se|no|es|mil|co';

$regex = '#(?:https?://)?([^.\s]+(?:[^\s.]|[^\s][^\s.])*\.(?:' . $common_tlds . ')[^.\s]*)#i';

ここで使用:

preg_replace($regex,'<a href="http://$1" target="_blank">$1</a>', $text);

PREG_BACKTRACK_LIMIT_ERROR非常に短いテキストで私に与えています。テキストの一例は次のとおりです。

Life cant always give you the best shoes,handbags,clothes but it can give you the best creations.

オンラインで正規表現を見つけるためのより良いリンクがあることは知っていますが、正規表現の何が大規模なバックトラッキングを引き起こしているのか、どうすればそれを改善できるのかに興味がありました。ありがとう!

4

1 に答える 1

1

次のようなことを試してください:

$regex = '#(?:https?://)?([^.\s]+(?:\.[^.\s]+)*\.(?:' . $common_tlds . '))#i';

コメント:

  • 壊滅的なバックトラッキングが発生しています。パターンには、文字列の一致に失敗する方法が多すぎます。
  • [^.\s]+(?:\.[^.\s]+)*ドメインを一致させる方法は 1 つしかなく、ドットで固定します。
  • [^.\s]*- 最後から削除されました。tld の後に何をするのかわかりません。のようなドメインに一致させたい場合は.co.il、そこに別のドットが必要になる場合があります。(?:\.[^.\s]+)?
  • \b一致を避けるために、最初にa が必要な場合があります(google.com
于 2012-07-24T18:03:55.023 に答える