Не другой вопрос разбора HTML-с-Regex - PullRequest
0 голосов
/ 21 января 2010

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

Сказав это, у меня есть очень специфическая проблема, на которую я думаю Regex может быть ответ. Я пытался найти ответ, но я новичок (сегодня) в Regex, и я надеялся, что какой-нибудь добросердечный человек сможет мне помочь.

У меня есть массив строк, которые всегда следуют формату

STUFF HERE<a href="somewhere" title="something" target="_blank">name of thing</a>STUFF HERE

То, чего я надеюсь достичь, - это оставить только «где-то» и «имя вещи», чтобы я мог вывести только <a href="somewhere">name of thing</a>.

Массив строк взят из RSS-канала ссылок в моем профиле на Facebook, если вам это интересно.

Большое, большое спасибо за любую помощь.

Jack

Ответы [ 5 ]

8 голосов
/ 21 января 2010

Я полностью понимаю, откуда вы по шкале прагматизма.

Однако PHP имеет очень приятный / простой HTML-парсер , и, кажется, достаточно просто заставить его работать, поэтому я бы не рекомендовал его.

2 голосов
/ 21 января 2010

Я не знаю PHP, но вы можете использовать следующее (чрезвычайно хрупкое) регулярное выражение:

<a href="(.+?)" title=".+?" target="_blank">(.+?)</a>

Это будет захватывать URL и текст ссылки.

Если вы хотите быть более гибким, вы можете использовать любые атрибуты, например:

<a .*?href="(.+?)".*?>(.+?)</a>
0 голосов
/ 21 января 2010

Я протестировал свой собственный канал в Facebook и мог загрузить его с помощью SimpleXML. Ну, отчасти. RSS-канал не может быть загружен напрямую, но если вы сначала загрузите Feed с MagPie, вы можете загрузить элемент description с SimpleXml следующим образом:

$xml = simplexml_load_string($description); // load description
$link = $xml->xpath('//a');                 // find all links inside
$href = (string) $link[0]['href'];          // get URL
$text = (string) $link[0];                  // and link text

Пока Facebook не нарушает HTML внутри описания, безопасно использовать SimpleXml. Если они сломают его, SimpleXml будет жаловаться.

0 голосов
/ 21 января 2010

SLaks regex может иметь некоторые проблемы с URL-адресами без атрибутов, кроме href, вот мое мнение:

~<a.+?href="(.+?)".*?>(.+?)</a>~i
0 голосов
/ 21 января 2010
$str = 'STUFF HERE<a href="somewhere" title"something" target="_blank">name of thing</a>STUFF HERE';
$success = preg_match('/.*href=\"([^\"]+)\".*>([^<]+)<.*/i', $str, $matches);
if ($success) {
    echo $matches[1];
    echo $matches[2];
} else {
    echo "Parsing failed.";
}

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

Внутри скобок я определяю содержание тех сегментов, которые вас интересуют, с помощью символов исключения. Первый - [^ \ "] +, который является одним или несколькими символами, кроме двойных кавычек. Последний - [^ <] +, который является одним или несколькими символами, кроме меньше. Это гарантирует, что если разметка соответствует предоставленному вами формату, то у вас есть четко определенные границы по обе стороны от интересующих вас частей. </p>

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