2010-01-05 3 views
1

Я использую cURL для захвата страницы, и я хочу разобрать заголовок сообщения (фактический текст, указанный в ссылке, а не атрибут title <a>).Regex, чтобы разобрать заголовок сообщения

HTML, как это:

<li class="topic"> 
    <a title="Permanent Link to Blog Post" rel="bookmark" href="http://www.website.com/blog-post/">Title of blog post</a> 
</li> 

Я попытался с помощью этого кода:

preg_match('/<\a title=\".*\" rel=\"bookmark\" href=\".*\">.*<\/a>/', $page, $matches); 

Но это не работает, PHP возвращает Array () (пустой массив).

Может ли кто-нибудь предоставить мне регулярное выражение для этого? Я пробовал онлайн-генераторы, но это происходит прямо над моей головой. Ура!

+4

Я думаю, что я где-то читал, что это была плохая идея для разбора HTML с использованием regex ... –

+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-s Эльф-содержал-теги/1732454 # 1732454 – Ragepotato

ответ

1

Добавить скобка к вашему выражению:

'/<a title=".*" rel="bookmark" href=".*">(.*)<\/a>/' 

Все между () будут возвращены в массиве.

Edit:

Вы должны удалить все забоя до кавычки.

Edit2:

Просто видел в documentation for preg_match

matches If обеспечивается, то он заполнен результатами поиска. $ matches [0] будет содержать текст, совпадающий с полным шаблоном, $ matches 1 будет иметь текст, сопоставляемый с первым захваченным скоблением в скобках и т. д.

Вы также должны указать test your expression с образцом текста, чтобы убедиться, что он действительно делает то, что вы хотите сделать.

0

Предполагая, что вы хотите, атрибут, вы можете использовать:

if (preg_match('/<a\s+[^>]*?\btitle="(.+?)"/', $page, $matches)) { 
    echo $matches[1], "\n"; 
} 

Синтаксический HTML может быть сложно, и регулярные выражения не до работы в общем случае. Для простых, нормальных документов вы можете избежать этого.

Просто имейте в виду, что вы управляете винтом с молотком.

0

$str = '<li class="topic"> <a title="Permanent Link to Blog Post" rel="bookmark" href="http://www.website.com/blog-post/"> Title of blog post</a> </li>; `

echo strip_tags ($ str);

Дает:

звание блоге

0

вот еще один способ

$str = <<<A 
<li class="topic"> 
    <a title="Permanent Link to Blog Post" rel="bookmark" href="http://www.website.com/blog-post/">Title of blog post</a> 
</li> 
A; 
$s = explode("</a>",$str); 
foreach ($s as $a=>$b){ 
    if(strpos($b,"<a title")!==FALSE){ 
     $b=preg_replace("/.*<a title.*>/ms","",$b); 
     print $b; 
    } 
} 

выход

$ php test.php 
Title of blog post 
Смежные вопросы