Получить содержимое в HTML-тег с помощью php и заменить его после обработки - PullRequest
4 голосов
/ 04 августа 2010

У меня есть html (sample.html), подобный этому:

<html>
<head>
</head>
<body>
<div id="content">
<!--content-->

<p>some content</p>

<!--content-->
</div>
</body>
</html>

Как мне получить часть содержимого, которая находится между комментариями 2 html '<!--content-->', используя php?Я хочу получить это, сделать некоторую обработку и поместить ее обратно, поэтому я должен получить и положить!Возможно ли это?

Ответы [ 5 ]

15 голосов
/ 04 августа 2010

esafwan - вы можете использовать выражение regex для извлечения содержимого между div (определенного идентификатора).

Я делал это ранее для тегов изображения, поэтому применяются те же правила.я посмотрю код и немного обновлю сообщение.

[обновить] попробуйте это:

<?php
    function get_tag( $attr, $value, $xml ) {

        $attr = preg_quote($attr);
        $value = preg_quote($value);

        $tag_regex = '/<div[^>]*'.$attr.'="'.$value.'">(.*?)<\\/div>/si';

        preg_match($tag_regex,
        $xml,
        $matches);
        return $matches[1];
    }

    $yourentirehtml = file_get_contents("test.html");
    $extract = get_tag('id', 'content', $yourentirehtml);
    echo $extract;
?>

или более просто:

preg_match("/<div[^>]*id=\"content\">(.*?)<\\/div>/si", $text, $match);
$content = $match[1]; 

Джим

8 голосов
/ 04 августа 2010

Если это простая замена, которая не включает анализ фактического HTML-документа, вы можете использовать для этого регулярное выражение или даже просто str_replace. Но, как правило, не рекомендуется использовать Regex для HTML , потому что HTML не является регулярным, и создание надежных шаблонов может быстро стать кошмаром .

Правильный способ для анализа HTML в PHP - это использовать библиотеку синтаксического анализа, которая на самом деле знает, как понимать HTML-документы. Ваша лучшая нативная ставка будет DOM , но PHP имеет ряд других собственных расширений XML , которые вы можете использовать, а также есть ряд сторонних библиотек, таких как phpQuery, Zend_Dom , QueryPath и FluentDom .

Если вы используете функцию поиска , вы увидите, что эта тема широко освещена , и у вас не должно возникнуть проблем с поиском примеров, показывающих, как решить ваш вопрос.

2 голосов
/ 04 августа 2010
<?php

    $content=file_get_contents("sample.html");
    $comment=explode("<!--content-->",$content);
    $comment=explode("<!--content-->",$comment[1]);
    var_dump(strip_tags($comment[0]));
?>

проверьте это, это будет работать для вас

1 голос
/ 06 февраля 2012

Проблема с вложенными div. Я нашел решение здесь

<code><?php // File: MatchAllDivMain.php
// Read html file to be processed into $data variable
$data = file_get_contents('test.html');
// Commented regex to extract contents from <div class="main">contents</div>
//  where "contents" may contain nested <div>s.
//  Regex uses PCRE's recursive (?1) sub expression syntax to recurs group 1
$pattern_long = '{           # recursive regex to capture contents of "main" DIV
<div\s+class="main"\s*>              # match the "main" class DIV opening tag
  (                                   # capture "main" DIV contents into $1
    (?:                               # non-cap group for nesting * quantifier
      (?: (?!<div[^>]*>|</div>). )++  # possessively match all non-DIV tag chars
    |                                 # or 
      <div[^>]*>(?1)</div>            # recursively match nested <div>xyz</div>
    )*                                # loop however deep as necessary
  )                                   # end group 1 capture
</div>                               # match the "main" class DIV closing tag
}six';  // single-line (dot matches all), ignore case and free spacing modes ON

// short version of same regex
$pattern_short = '{<div\s+class="main"\s*>((?:(?:(?!<div[^>]*>|</div>).)++|<div[^>]*>(?    1)</div>)*)</div>}si';

$matchcount = preg_match_all($pattern_long, $data, $matches);
// $matchcount = preg_match_all($pattern_short, $data, $matches);
echo("<pre>\n");
if ($matchcount > 0) {
    echo("$matchcount matches found.\n");
//  print_r($matches);
    for($i = 0; $i < $matchcount; $i++) {
        echo("\nMatch #" . ($i + 1) . ":\n");
        echo($matches[1][$i]); // print 1st capture group for match number i
    }
} else {
    echo('No matches');
}
echo("\n
");?>
1 голос
/ 04 августа 2010

Посмотрите здесь пример кода, который означает, что вы можете загрузить документ HTML в SimpleXML http://blog.charlvn.com/2009/03/html-in-php-simplexml.html

Затем вы можете рассматривать его как обычный SimpleXML объект.

РЕДАКТИРОВАТЬ: Это будет работать, только если вы хотите, чтобы содержимое тега (например, между

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