Нахождение конкретной строки и сбор данных после нее - PullRequest
0 голосов
/ 09 ноября 2009

Я создал сайт очень давно, и теперь я хочу поместить данные в базу данных, не копируя и не вставляя 400+ страниц, которые они выросли, чтобы я мог управлять базой данных сайта.

У моего сайта есть метатеги, подобные этой (каждая страница отличается):

<meta name="clan_name" content="Dark Mage" />

Итак, я использую cURL, чтобы поместить всю HTML-страницу в переменную в виде строки. Я также могу сделать это с помощью fopen и т. Д., Но я не думаю, что это имеет значение.

Мне нужно перебрать строку, чтобы найти 'Dark Mage' и сохранить ее в переменной (чтобы я мог поместить в sql)

Есть какие-нибудь идеи о том, как найти Dark Mage для хранения в переменной? Я пытался использовать substr, а затем просто вычитал количество символов из e в clan_name, но это было перебор.

Ответы [ 3 ]

4 голосов
/ 09 ноября 2009

Просто проанализируйте страницу, используя функции PHP DOM, в частности loadHTML () . Затем вы можете пройтись по дереву или использовать xpath, чтобы найти искомые узлы.

<?
$doc = new DomDocument;
$doc->loadHTML($html);
$meta = $doc->getElementsByTagName('meta');
foreach ($meta as $data) {
  $name = $meta->getAttribute('name');
  if ($name == 'clan_name') {
    $content = $meta->getAttribute('content');
    // TODO handle content for clan_name
  }
} 
?>

РЕДАКТИРОВАТЬ Если вы хотите удалить некоторые теги (например, <script>) перед загрузкой строки HTML в память, попробуйте использовать функцию strip_tags(). Примерно так будут сохраняться только метатеги:

<?
  $html = strip_tags($html, '<meta>');
?>
2 голосов
/ 09 ноября 2009

Используйте регулярное выражение , как показано ниже, с PHP preg_match () :

/<meta name="clan_name" content="([^"]+)"/

Если вы не знакомы с регулярными выражениями, читайте дальше.

Косая черта в начале и в конце разделяет регулярное выражение. Материал внутри разделителей довольно прост, за исключением конца.

Квадратные скобки ограничивают класс символов , а знак вставки в начале класса символов является оператором отрицания; вместе взятые, этот класс символов:

[^"]

означает «соответствовать любому символу, который не является двойной кавычкой».

+ - это квантификатор , который требует, чтобы предыдущий элемент встречался как минимум один раз, и соответствует такому количеству предыдущего элемента, которое появляется рядом с первым. Итак, это:

[^"]+

означает «соответствовать одному или нескольким символам, которые не являются двойными кавычками».

Наконец, круглые скобки заставляют механизм регулярных выражений хранить что-либо между ними в подшаблоне . Итак, это:

([^"]+)

означает «сопоставить один или несколько символов, которые не являются двойными кавычками, и сохранить их как соответствующий подшаблон.

В PHP preg_match () сохраняет совпадения в массиве, который вы передаете по ссылке. Полный шаблон хранится в первом элементе массива, первый подшаблон во втором элементе и т. Д., Если есть дополнительные подшаблоны.

Итак, если ваша HTML-страница находится в переменной "$ page", следующий код:

$matches = array();
$found = preg_match('/<meta name="clan_name" content="([^"]+)"/', $page, $matches);

if ($found) {
    $clan_name = $matches[1];
}

Должен получить то, что вы хотите.

1 голос
/ 09 ноября 2009

Использовать preg_match . Возможный шаблон регулярного выражения: /clan_name.+content="([^"]+)"/

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