Извлечение rel с помощью href

Следующее регулярное выражение извлекает все 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
)

)

0

Решение

Можно дополнительно захватить его с помощью смотреть вперед:

$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. Зависит от того, что вы собираетесь достичь, и как выглядит вход / если это ваш вклад и знать, чего ожидать.

0

Другие решения

\s+href\s*=\s*[\"\']?(([^\s\"\']+)[\"\'\s]+rel="[^"]*")|\s+href\s*=\s*[\"\']?([^\s\"\']+)[\"\'\s]+

Вы можете использовать это. Это даст rel если это там.

Смотрите демо.

http://regex101.com/r/jT3pG3/4

1