/ / W jaki sposób można to poprawić za pomocą ulepszenia? Jest to trafienie do PREG_BACKTRACK_LIMIT_ERROR dla PHP na bardzo krótkim tekście - php, regex

W jaki sposób można to poprawić za pomocą ulepszenia? Uderza w PREG_BACKTRACK_LIMIT_ERROR dla PHP na bardzo krótki tekst - php, regex

Następujące wyrażenie regularne:

$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";

używane tutaj:

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

Daje mi PREG_BACKTRACK_LIMIT_ERROR w bardzo krótkim tekście. Jeden przykładowy tekst to:

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

Wiem, że istnieją lepsze linki do wyszukiwania regex online, ale byłem ciekawy, co w moim regex powodowało masowe wycofywanie i jak mogłem to poprawić. Dzięki!

Odpowiedzi:

1 dla odpowiedzi № 1

Spróbuj czegoś takiego:

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

Komentarze:

  • Widzisz katastroficzne wycofywanie - twój wzorzec ma zbyt wiele sposobów na niepowodzenie w dopasowaniu ciągu znaków.
  • [^.s]+(?:.[^.s]+)* pozwala tylko na jeden sposób dopasowania domeny, zakotwiczenie w kropki.
  • [^.s]* - Usunięto z końca, nie wiem, co ma zrobić po tld. Jeśli chcesz dopasować domeny, takie jak .co.ilmożesz potrzebować innej kropki: (?:.[^.s]+)?
  • Możesz chcieć b na początku, aby uniknąć dopasowania (google.com.