2016-06-02 9 views
1

Ich habe die folgenden 2 Sätze Code (Wordpress) mit Regex, aber mir wurde gesagt, dass es eine schlechte Praxis ist.
Ich benutze es in zwei Arten:Ändern von Code aus Regex

  1. Um die Blockquote und Bilder von der Post ake und nur den Text anzuzeigen.
  2. Um im Wesentlichen das Gegenteil zu tun und nur die Bilder anzuzeigen.

Mit Blick auf das Schreiben in der richtigen akzeptabler/Cross-Browser-Form.

html (Displaytext):

<?php 
$content = preg_replace('/<blockquote>(.*?)<\/blockquote>/', '', get_the_content()); 
$content = preg_replace('/(<img [^>]*>)/', '', $content); 
$content = wpautop($content); // Add paragraph-tags 
$content = str_replace('<p></p>', '', $content); // remove empty paragraphs 
echo $content; 
?> 

html (Anzeigebilder):

<?php 
preg_match_all('/(<img [^>]*>)/', get_the_content(), $images); 
for($i=0; isset($images[1]) && $i < count($images[1]); $i++) { 
    if ($i == end(array_keys($images[1]))) { 
     echo sprintf('<div id="last-img">%s</div>', $images[1][$i]); 
     continue; 
    } 
    echo $images[1][$i]; 
} 
?> 

Antwort

0

können Sie die Antwort von hier verwenden: Strip Tags and everything in between

Der Punkt ist, einen Parser zu verwenden , anstatt Roll-your-Own-Regex, die Buggy sein könnte.

$content = get_the_content(); 
$content = wpautop($content); 

$doc = new DOMDocument(); 
$doc->loadHTML(get_the_content(), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DOMXPath($doc); 

foreach ($xpath->query('//blockquote') as $node) { 
    $node->parentNode->removeChild($node); 
} 

foreach ($xpath->query('//img') as $node) { 
    $node->parentNode->removeChild($node); 
} 

foreach($xpath->query('//p[not(node())]') as $node) { 
    $node->parentNode->removeChild($node); 
} 

$content = $doc->saveHTML($doc); 

Sie können feststellen, dass php DOMDocument Ihr HTML-Fragment in <html> Tags eingewickelt hat, wobei in diesem Fall Blick auf How to saveHTML of DOMDocument without HTML wrapper?

Der Teil, der Tags leer p entfernt ist von Remove empty tags from a XML with PHP

+0

Wie würde ich jeden Ort Stück zurück in die Seite html, nachdem es herausgenommen wurde? an verschiedenen Orten? Ich habe Echo in meinem vorherigen Code verwendet – user3550879

+0

Verwenden Sie einfach wieder 'echo'. Probiere 'echo $ content' am Ende des Codes über –

+0

würde das nicht alles zurück bringen? – user3550879