2010-08-04 8 views
4

J'ai un html (sample.html) comme ceci:Obtenez le contenu dans une balise HTML en utilisant php et le remplacer après traitement

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

<p>some content</p> 

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

Comment puis-je obtenir la partie du contenu qui est entre le 2 html commentaire '<!--content-->' en utilisant php? Je veux obtenir cela, faire un peu de traitement et le remettre, alors je dois mettre et mettre! C'est possible?

+0

par "contenu" vous voulez dire '' certains content' ou

certains contenus

' et seront les nœuds de commentaires écrits toujours' '? – Gordon

Répondre

14

esafwan - vous pouvez utiliser une expression regex pour extraire le contenu entre la div (d'un certain id).

Je l'ai fait pour les balises d'image avant, de sorte que les mêmes règles sont applicables. Je vais regarder le code et mettre à jour le message dans un peu.

[mise à jour] essayez ceci:

<?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; 
?> 

ou plus simplement:

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

jim

+0

alors où est l'attribut 'id' dans' '? – Gordon

+0

gordon - la section qui a été extraite est le contenu contenu dans le contenu (id) div. dans le même sens que le jQuery $ ('# content'). html() fonction –

+0

mais comment puis-je charger le code HTML à $ yourentirehtml? – esafwan

8

Si cela est un remplacement simple qui ne nécessite pas l'analyse du réel Document HTML, vous pouvez utiliser une expression régulière ou même simplement str_replace pour cela. Mais en général, it is not a advisable to use Regex for HTML parce que le HTML n'est pas régulier et coming up with reliable patterns can quickly become a nightmare.

La bonne façon to parse HTML in PHP est d'utiliser une bibliothèque d'analyse qui sait réellement donner un sens aux documents HTML. Votre meilleur pari natif serait DOM mais PHP a un certain nombre de other native XML extensions que vous pouvez utiliser et il y a aussi un certain nombre de bibliothèques tierces comme phpQuery, Zend_Dom, QueryPath et FluentDom.

Si vous utilisez le search function, you will see that this topic has been covered extensively et vous ne devriez pas avoir de problèmes pour trouver des exemples qui montrent comment résoudre votre question.

+0

de bons points soulevés re modèles fiables –

+1

+1, et si vous cherchez un bon XPath pour faire correspondre les nœuds, il est '(// * | // text()) [previous-sibling :: comment() = 'content' et following-sibling :: comment() = 'content']' – Wrikken

+0

Merci ... Tous les liens m'ont aidé beaucoup, même si ça ne me répondait pas directement. Les liens valent la peine d'être lus et m'ont aidé à approfondir en 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])); 
?> 

vérifier, il travaillera pour vous

1

problème est avec divs imbriqués j'ai trouvé la solution 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>"); 
?> 
Questions connexes