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 № 1Spró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.il
możesz potrzebować innej kropki:(?:.[^.s]+)?
- Możesz chcieć
b
na początku, aby uniknąć dopasowania(google.com
.