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]+)*只允许一种匹配域的方式,锚定在点上。
  • [^.\s]*- 从最后删除,不确定在 tld 之后应该做什么。如果你想匹配类似的域.co.il,你可能需要另一个点:(?:\.[^.\s]+)?
  • 您可能需要 a\b在开头,以避免匹配(google.com.
于 2012-07-24T18:03:55.023 回答