2010-08-10 2 views
1

Мне нужно получить тег anchor innerHTML с помощью RegExp в php. Рассмотрим У меня есть синтаксис какРегулярное выражение для получения содержимого тега привязки InnerHTML в php

<div class="detailsGray"><span class="detailEmail"><a href="http://example.com"class="fontLink">[email protected]</a></span></div> 

попытаться получить его

preg_match_all('/class=\"fontLink"\>.*\<\/a\>/', $raw, $matches); 

, но который не работает. Только мне нужно получить примеры@mail.com с помощью RegExp и preg_match_all(). Благодаря

+0

Вам действительно нужно это делать с помощью PHP? Потому что, если это нормально, вы можете использовать JQuery или простой javascript, чтобы получить то, что хотите. Например, если вы хотите получить якорный тэг, просто используйте $ ('. Fontlink'). Attr ('href') .. просто предложение .. – Manie

+0

Спасибо за ваше предложение. Но, к сожалению, мне нужно использовать php. – abhis

+0

Возможный дубликат [Регулярное выражение для получения содержимого div-класса в php] (http://stackoverflow.com/questions/3446766/regular-expression-to-get-contents-of-div-class-in-php) – Gordon

ответ

2

Используйте анализатор. К счастью, у PHP есть один!

$html = '<div class="detailsGray"><span class="detailEmail"><a href="http://example.com" class="fontLink">[email protected]</a></span></div>'; 
echo retrieve_node_text($html, "//a[@class='fontLink']"); 

// ----------------------------------------------- 
function retrieve_node_text($html_fragment, $xpath) { 
    $fragment = new DOMDocument(); 
    $fragment->loadHTML($html_fragment); 

    if ($fragment) { 
    $xp = new DOMXPath($fragment); 
    $result = $xp->query($xpath); 

    if ($result->length == 1) { 
     return $result->item(0)->textContent; 
    } 
    } 
    return FALSE; 
} 

возвращается:

[email protected] 
+0

Большое вам спасибо – abhis

+0

@Ajith: Не забудьте поместить в код некоторую проверку ошибок и обработку. Не гарантируется, что 'loadHTML()' или 'query()' запускаются успешно, так как могут быть разбиты как '$ html_fragment', так и' $ xpath'. Обязательно протестируйте со сломанным вводом и соответствующим образом обработайте ошибки PHP или предупреждения. – Tomalak

2

Глядя на Regex немного беспорядок:

'/class=\"fontLink\">.*?<\/a>/'

Насколько я знаю, нет ничего особенного <> в регулярном выражении.

Вы не хотите .*, так как это будет идти прямо к концу линии, а затем начнет работать назад. .*? примет следующий символ, если не соответствует </a>.

0

Что вы вводите? Если это сырые данные из Интернета, regexp не является надежным способом сделать это. Было бы лучше загрузить ваш дом как дерево.

0

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

(?<=class=\"fontLink\"\>).*(?=\<\/a\>) 
0

Я думаю, что ваш подход был достаточно хорош. Это мое решение:

preg_match('/class=\"fontLink"\>(.*)\<\/a\>/', $raw, $matches); 
$parsedEmail = $matches[1]; 

Просто добавьте скобки на нужные вам части, чтобы их можно было сопоставить в одиночку. Если вы хотите использовать только одну проблему, используйте preg_match() вместо preg_match_all().

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