Разница в том, что выражение 1 ищет действительные и полные URI, следуя спецификации. Таким образом, вы получаете все полные URL, которые находятся где-то внутри кода. На самом деле это не связано с получением всех ссылок, потому что он не соответствует относительным URL-адресам, которые очень часто используются, и он получает все URL-адреса, а не только те, которые являются целевыми ссылками.
Второй ищет теги a
и получает содержимое атрибута href
. Так что этот получит вам каждую ссылку. За исключением одной ошибки * в этом выражении, использовать ее вполне безопасно, и она будет работать достаточно хорошо, чтобы получить каждую ссылку - она проверяет наличие достаточно различий, таких как пробелы или другие атрибуты.
* Однако в этом выражении есть одна ошибка, так как он не ищет закрывающую кавычку атрибута href
, вы должны добавить это, или вы можете сопоставить странные вещи:
/<a.*?href\s*=\s*["\']([^"\'>]+)["\'][^>]*>.*?<\/a>/si
изменить в ответ на комментарий:
Чтобы найти word
внутри ссылки, используйте:
/<a.*?href\s*=\s*["\']([^"\'>]*word[^"\'>]*)["\'][^>]*>.*?<\/a>/si
Чтобы найти word
внутри текста ссылки, используйте:
/<a.*?href\s*=\s*["\']([^"\'>]+)["\'][^>]*>.*?word.*?<\/a>/si