2012-02-21 4 views
0

Я пытаюсь захватить числовое значение (т.е. 105) с помощью preg_match из HTML страницы, пожалуйста, проверьте мой HTML код следующие ...preg_match вопрос

<p> 
       External Backlinks 
      </p> 
      <p style="font-size: 150%;"> 
       <b>105</b> 
      </p> 

И я, используя следующее регулярное выражение ...

$url = 'http://www.example.com/test.html'; 

preg_match('#<p>External Backlinks</p><p style="font-size: 150%;"><b>([0-9\.]+)#', file_get_contents($url), $matches); 

echo $matches[1]; 

Но это не возвращает правильное значение, пожалуйста, помогите исправить вышеупомянутое регулярное выражение. Благодарю.

+3

http://stackoverflow.com/a/1732454/1163867 – MarcinJuraszek

+0

Для HTML не используйте * regex *, используйте * xpath * , Xpath являются «регулярными» выражениями для HTML/XML, например. '// p [@ style =" font-size: 150%; "]/b'. – hakre

ответ

0

Я не рекомендую использовать регулярное выражение для анализа HTML. Вместо этого используйте DOM parser. Read this rant for more information about why :)

Чтобы ответить на ваш вопрос. Вот работает регулярное выражение для примера:

<p>[^E]*External Backlinks[^<]*<\/p>[^<]*<p style="font-size: ?150%;">[^<]*<b>(\d+)<\/b>[^<]*<\/p> 

Это некрасиво, но это работает ... Не используйте его.

preg_match('#<p>[^E]*External Backlinks[^<]*<\/p>[^<]*<p style="font-size: ?150%;">[^<]*<b>(\d+)<\/b>[^<]*<\/p>#', file_get_contents($url), $matches); 

echo $matches[1]; 

Выход:

105 

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

Если источник выглядел примерно так:

<p>External Backlinks</p><p style="font-size: 150%;"><b>105</b></p> 

Yours работали бы, однако, не очень надежный. (Tho, я думаю, можно утверждать, что использование регулярного выражения для анализа HTML никогда не является очень надежным.)