2010-08-04 3 views
4

У меня есть HTML (sample.html), как это:Получить содержимое в теге HTML, используя PHP и заменить его после обработки

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

<p>some content</p> 

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

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

+0

по "содержанию" вы имеете в виду 'некоторый Content' или'

некоторое содержание

' и будут ли узлы комментариев всегда записываться' '? – Gordon

ответ

14

esafwan - вы можете использовать выражение регулярного выражения для извлечения содержимого между 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]; 

джим

+0

Так где атрибут 'id' в' '? – Gordon

+0

gordon - раздел, который вытащил, - это содержимое, содержащееся в содержимом (id) div. по тем же самым строкам, что и функция jQuery $ ('# content'). html() –

+0

, но как я могу загрузить html в $ yourentirehtml? – esafwan

1

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

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

EDIT: Это будет работать только если вы хотите, чтобы содержимое в тег (например, между < ДИВ > и </дел >)

8

Если это простой замена, которая не включает в себя разбор фактического HTML, вы можете использовать регулярное выражение или даже просто str_replace для этого. Но в целом, it is not a advisable to use Regex for HTML, потому что HTML не является регулярным и coming up with reliable patterns can quickly become a nightmare.

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

Если вы используете search function, you will see that this topic has been covered extensively, и вам не составит труда найти примеры, которые показывают, как решить ваш вопрос.

+0

хорошие точки подняли надежные шаблоны –

+1

+1, и если вы ищете подходящий XPath для соответствия узлам, это '(// * | // text()) [previous-sibling :: comment() = 'content' и next-sibling :: comment() = 'content']' – Wrikken

+0

Thanx ... Все ссылки помогли мне много, хотя он не ответил мне прямо. Ссылки заслуживают чтения и помогли мне получить больше глубины в php! – esafwan

2
<?php 

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

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

1

проблемы с вложенной дивой Я нашел решение here

<?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</pre>"); 
?> 
Смежные вопросы