извлекать любой введенный пользователем тег html из реального URL документа html, используя регулярное выражение php - PullRequest
1 голос
/ 24 июня 2011

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

<?php
function get_tag($tag_name, $url)
{
    $content = file_get_contents($url);

    // this is not correct : regular expression please //
    preg_match_all($tag_name, $content, $matches);

    return $matches;
}

print_r(get_tag('title', 'http://stackoverflow.com'));

?>

Вывод должен прийти примерно так:

Array
(
    [0] => title
    [1] => Stack Overflow
)

Спасибо !!

Ответы [ 3 ]

1 голос
/ 24 июня 2011
function get_tags($tag, $url) {
//allow for improperly formatted html
libxml_use_internal_errors(true);
// Instantiate DOMDocument Class to parse html DOM
$xml = new DOMDocument();

// Load the file into the DOMDocument object
$xml->loadHTMLFile($url);

// Empty array to hold all links to return
$tags = array();

//Loop through all tags of the given type and store details in the array
foreach($xml->getElementsByTagName($tag) as $tag_found) {
      if ($tag_found->tagName == "meta")
      {
        $tags[] = array("meta_name" => $tag_found->getAttribute("name"), "meta_value" => $tag_found->getAttribute("content"));
      }
      else {
    $tags[] = array('tag' => $tag_found->tagName, 'text' => $tag_found->nodeValue);
     }
}

//Return the links
return $tags;
}

Этот ответ фактически даст вам имя тега в качестве первого значения массива, а не «массива», а также остановит предупреждение.

1 голос
/ 24 июня 2011

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

Попробуйте с DOMDocument, например:

<?

function get_tags($tags, $url) {

    // Create a new DOM Document to hold our webpage structure
    $xml = new DOMDocument();

    // Load the url's contents into the DOM
    $xml->loadHTMLFile($url);

    // Empty array to hold all links to return
    $tags_found = array();

    //Loop through each <$tags> tag in the dom and add it to the $tags_found array
    foreach($xml->getElementsByTagName($tags) as $tag) {
        $tags_found[] = array('tag' => $tags, 'text' => $tag->nodeValue);
    }

    //Return the links
    return $tags_found;
}

print_r(get_tags('title', 'http://stackoverflow.com'));

?>
0 голосов
/ 24 июня 2011

Поскольку эти теги не могут быть вложенными, синтаксический анализ не требуется.

#<(meta|title|script|link)(?: .*?)?(?:/>|>(.*?)<(?:/\1)>)#is

Если вы используете это со своей функцией, вам придется написать $ tag_name вместо "meta | title | script | link".

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