Запросы Regex - кто-нибудь может помочь? - PullRequest
1 голос
/ 16 февраля 2011

Я все еще пытаюсь разобраться с Regex и надеюсь, что кто-нибудь может помочь с простым запросом.Я пытаюсь разобрать домашнюю страницу моего сайта и извлечь теги H1.

  <?php
    $string_get = file_get_contents("http://davidelks.com/");


    $replace = "$1";

    $matches = preg_replace ("/<h1 class=\"title\"><a href=\"([A-Z]|[0-9]|[a-z]|[\s]|[\x21]|[\/]|[\-]|[\.]|[\£]|[\:])*\">([A-Z]|[0-9]|[a-z]|[\s]|[\x21]|[\/]|[\-]|[\.]|[\£]|[\:])*<\/a><\/h1>/", $replace, $string_get, 1);

    $string_construct = "Mum " . $matches .  " Dad";

    echo ($string_construct);

    ?>

Однако вместо того, чтобы просто отображать первую HTML-ссылку с помощью токена $ 1, она просто вытягивает всю страницу.

Кто-нибудь может помочь?

Ответы [ 3 ]

4 голосов
/ 16 февраля 2011

Это похоже на то, что можно легко сделать с помощью DOM-парсера :

libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->load('http://davidelks.com/');
$h1 = $dom->getElementsByTagName('h1')->item(0);
echo $h1->textContent;

Вы должны получить:

Let's make things happen in and around Stoke-on-Trent

Примечание: Я не уверен, что это ваш сайт или сайт, которым вы управляете, но на странице HTML не должно быть более одного тега <h1> (на главной странице есть пара).

1 голос
/ 16 февраля 2011

Ошибка в использовании preg_replace.Вы хотели извлечь что-то, для чего следует использовать preg_match:

<?php
 $text = file_get_contents("http://davidelks.com/");

 preg_match('#<h1 class="title"><a href="([\w\s\x21\/\-\.\£\:]*)">([^<>]*)</a></h1>#', $text, $match);

 echo "Mum " . $match[1] .  " Dad";
?>

Обратите особое внимание, что вы можете комбинировать классы символов.Вам не нужно [A-Z]|[a-z]|[..], потому что вы можете просто объединить его в один список [A-Za-z...] в квадратных скобках.

Также попробуйте использовать одинарные кавычки для строки PHP, если вы хотите искать двойные кавычки внутри.Это экономит много посторонних побега.Как и альтернативные вложения # вместо / вокруг регулярного выражения.

0 голосов
/ 16 февраля 2011

Было бы проще использовать DOM-парсер. Но если вы хотите сделать это с помощью регулярных выражений, вы должны использовать функцию preg_match_all в php:

preg_match_all("/<h1 class=\"title\"><a href=\"([A-Z]|[0-9]|[a-z]|[\s]|[\x21]|[\/]|[\-]|[\.]|[\£]|[\:])*\">([A-Z]|[0-9]|[a-z]|[\s]|[\x21]|[\/]|[\-]|[\.]|[\£]|[\:])*<\/a><\/h1>/",$string_get,$matches);
var_dump($matches);
...