2010-12-22 2 views
0

мне нужна помощь, чтобы разобрать HTML, извлекая все, начиная с HTTP:. //, не содержащий «а» до первого вхождения в "или" или пробелеPHP регулярного выражения для разбора HTML

у меня есть некоторые регулярные выражения, как это /http:\/\/abc(.*)\"/, но это не работает: \

есть идеи?)

P.S. извините за плохой английский, это не мой естественный язык;)

+0

Нет, но серьезно, дайте нам образцы данных, которые вы пытаетесь проанализировать. И объясните, что вы подразумеваете под «плохой работой». –

+0

@Joshua: Нет, но серьезно, OP должен использовать парсер HTML. :) – netcoder

+4

ПОЖАЛУЙСТА, прекратите публикацию ссылок на этот комментарий. Это слишком умно для собственного блага, так что люди, которые его получают, это люди, которые уже получают его, а люди, которые должны знать, этого не понимают. –

ответ

5

StackOverflow, как правило, предпочитает документ HTML Parser над регулярными выражениями для разбора HTML.

Однако, если вы просто хотите, чтобы URL-адреса из строки, которая является HTML, я все же верю, что Regex отлично подходит для работы.

Попробуйте preg_match_all:

preg_match_all("/http:\/\/[^\s'\"]*abc[^\s'\"]*/", $string, $matches); 
+3

Это не переполнение стека, которое предпочитает разбор HTML с DOM, это сам HTML, который предпочитает его над регулярным выражением. ;) – netcoder

+3

@netcoder, Fair, но это сообщество обычно кричит HTML для этих типов вопросов. И хотя я уважаю вашу точку зрения, что-то вроде разбора URL-адресов отлично подходит для регулярного выражения. –

0

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

Если у вас есть Unix-подобные инструменты командной вы могли бы приблизить его очень просто (предполагается, что один URL в каждой строке) с двумя проходами:

grep http myfile.html | grep abc 

Вы можете использовать preg_grep() аналогично.

preg_match_all ('/http:[^"\' ]+/', $html, $urls); 
# $urls contains all the urls from your document 
$abc_urls = preg_grep('/abc/', $urls); 
+0

О, дорогой. Этот URL-адрес содержит строку запроса. Поэтому он включает '&'. Используйте настоящий синтаксический анализатор. – Quentin

+0

Это регулярное выражение будет отлично с '&', просто никаких пробелов или кавычек. Моя точка с примером grep заключается в том, что существуют практические альтернативы реальному парсеру, в зависимости от того, что вы пытаетесь сделать. – Nathan

+0

Он не вытащил бы URL-адрес, хотя бы вытащил URL-адрес, закодированный в HTML. У парсеров есть решения для встроенных корпусов. – Quentin

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