Следующее регулярное выражение извлекает все hrefs со страницы с помощью preg_match_all:
/\s+href\s*=\s*[\"\']?([^\s\"\']+)[\"\'\s]+/ims
Если в теге a есть атрибут rel, я бы хотел вернуть его с результатом. Как я могу изменить код в верхней части, чтобы включить атрибут ‘rel’ (если есть)?
ОБНОВИТЬ:
следующие:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
ut aliquip ex ea commodo consequat. <a href="http://example.com" rel="nofollow">Duis</a>
nirure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
возвращает:
Array
(
[0] => Array
(
[0] => href="http://example.com")
[1] => Array
(
[0] => http://example.com
)
)
Я хотел бы, чтобы он вернулся:
Array
(
[0] => Array
(
[0] => href="http://example.com" rel="nofollow")
[1] => Array
(
[0] => http://example.com
)
)
Можно дополнительно захватить его с помощью смотреть вперед:
$regex = '~<a\b(?=(?>[^>]*rel\s*=\s*["\']([^"\']+))?)[^>]*href=\s*["\']\s*\K[^"\']+~';
Добавить i (PCRE_CASELESS)
модификатор после закрытия ограничитель ~
соответствовать без учета регистра.
Смотрите дальнейшие объяснения и пример на regex101 а также SO Regex FAQ
С помощью preg_match_all может быть хочу добавить PREG_SET_ORDER
флаг:
preg_match_all($regex, $str, $out, PREG_SET_ORDER);
print_r($out);
Что дает такой результат:
Array
(
[0] => Array
(
[0] => http://example.com
[1] => nofollow
)
[1] => Array
(
[0] => http://example2.com
[1] => nofollow
)
)
Увидеть тест на eval.in
Как уже упоминалось, регулярное выражение не является совершенные средства для разбора HTML. Зависит от того, что вы собираетесь достичь, и как выглядит вход / если это ваш вклад и знать, чего ожидать.
\s+href\s*=\s*[\"\']?(([^\s\"\']+)[\"\'\s]+rel="[^"]*")|\s+href\s*=\s*[\"\']?([^\s\"\']+)[\"\'\s]+
Вы можете использовать это. Это даст rel
если это там.
Смотрите демо.