2010-07-29 3 views
1

Я использую php, и у меня возникла проблема в том, чтобы проанализировать href из тега привязки с текстом.регулярное выражение привязка тега

пример: якорь тег, имеющий тест http://www.test.com

как этот <a href="http://www.test.com" title="test">http://www.test.com</a>

я хочу, чтобы соответствовать весь текст в теге привязки

заранее спасибо.

+0

Можете ли вы показать, что вы пробовали? – antyrat

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454: не анализируйте HTML с регулярным выражением. – katrielalex

+1

два вопроса, 1-й: вы хотите совместить тест или http: //www.test.com? 2nd: вы хотите совместить его ' or here?'? – Ties

ответ

-1

Предполагая, что вы хотите выбрать текст ссылки в ссылке якорный с этим HREF, то что-то, как это должно работать ...

$input = '<a href="http://www.test.com" title="test">http://www.test.com</a>'; 
$pattern = '#<a href="http://www\.test\.com"[^>]*>(.*?)</a>#'; 

if (preg_match($pattern, $input, $out)) { 
    echo $out[1]; 
} 

Это технически не совершенен (в теории>, вероятно, может быть использован в один из тегов), но будет работать в 99% случаев. Как уже отмечалось в нескольких комментариях, вы должны использовать DOM.

-1

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

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

Если вместо этого вы хотите, чтобы извлечь содержимое тега, и вы знаете, что вы делаете, нетрудно написать простой рекурсивный парсер спуска, используя каскадные регулярные выражения, которые будут анализировать все, кроме самых патологических случаев. К сожалению, PHP не является хорошим языком, чтобы узнать, как это сделать, поэтому я бы не рекомендовал использовать этот проект, чтобы узнать, как это сделать.

Так что если это содержимое, которое вы используете, а не атрибут, тогда @katrielalex прав: не анализируйте HTML с регулярным выражением. Вы столкнетесь с миром травмы с вложенными тегами форматирования и другим юридическим HTML, который несовместим с регулярными выражениями.

6

Использование DOM:

$text = '<a href="http://www.test.com" title="test">http://www.test.com</a> something else hello world'; 
$dom = new DOMDocument(); 
$dom->loadHTML($text); 

foreach ($dom->getElementsByTagName('a') as $a) { 
    echo $a->textContent; 
} 

DOM разработан специально для разбора XML и HTML. Он будет более надежным, чем любое решение регулярных выражений, которое вы можете придумать.

+0

Не что-то «неправильное» в том, как вы это сделали, почему вы просто не использовали 'DomElement :: getElementsByTagName()' вместо запроса XPath? Он должен быть более эффективным для этого простого пути ... – ircmaxell

+0

@ircmaxell: Не уверен. Я обновил его, чтобы сделать это вместо этого. –

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