2014-11-28 3 views
1

Я написал регулярное выражение, чтобы узнать HREF из тега привязки
Моего регулярного выраженияPHP не жадное регулярное выражение

<a.*?href="(.*?)">blah<\/a> //dot is matching all 

Так, по мне, это будет начать соответствие с <a, пока он не узнает, что первый href. После этого он будет захватывать url в href до первого ", а затем он будет соответствовать для blah.
Но это соответствие нескольких наборов тегов привязки, которые имеют ли-тег в конце, например:

<a href="some_url">abc</a> 
<a href="some_url1">def</a> 
<a href="get_this">blah</a> 

По мне следует захватить только последний URL, как регулярное выражение соответствует его отлично.

+0

Что вы подразумеваете под "отлично"? Вы regexp сопоставляете весь код из-за части '. *?'. –

+0

хорошо, что «отлично» часть соответствует мне, и я определенно ошибаюсь. И нет. *? должен остановиться до того, как он совпадёт с следующим персонажем, поскольку он не является жадным совпадением? – Dheerendra

+0

Он будет соответствовать всему тегу, но 'href' находится в первой захваченной группе' $ 1' – gwillie

ответ

2

Чтобы ответить на этот вопрос, вы можете поменять свой точечный оператор для не группы, чтобы соответствовать все, кроме закрывающего тега:

<a[^>]*href="([^"]*)">def<\/a> 

Это (в теории) гарантирует, что шаблон регулярного выражения будет соответствовать только внутри конкретный тег.

Чтобы не отвечать на ваш вопрос: часто не рекомендуется анализировать HTML с регулярным выражением, если вы не можете быть абсолютно уверены в том, как именно он отформатирован. Возможно, вы захотите посмотреть в PHP DOM.

Смежные вопросы