2010-10-15 41 views
0

J'utilise actuellement l'expression suivante que j'utilise pour mettre des balises de paragraphe autour des entrées de textarea avant de les stocker dans une base de données MySQL.Entrée Textarea - comment traiter les paragraphes et les titres?

$inputText = str_replace('<p></p>', '', '<p>' . preg_replace('#([\r\n]\s*?[\r\n]){2,}#', '</p>$0<p>', $inputText) . '</p>'); 

Cela fonctionne bien, sauf lorsque je souhaite utiliser des étiquettes d'en-tête. Ceux-ci sont ensuite entourés par des balises indésirables paragraphe:

<p><h3>Test Header</h3></p> 

Bien que cette affiche comme prévu, il n'est pas grande d'un point de vue de la validation.

Quelqu'un peut-il suggérer une expression et/ou une méthode améliorées pour intercepter les étiquettes d'en-tête et appliquer uniquement les étiquettes de paragraphe aux paragraphes réels? Ou, une expression que je peux appliquer à mon entrée avant l'expression que j'utilise actuellement pour produire le même effet désiré.

En note, j'aimerais pouvoir entrer des balises autonomes 'a' de lien hypertexte tout en les entourant de balises de paragraphe comme auparavant.

J'ai considéré qu'il peut être plus facile d'éditer manuellement les détails après leur entrée dans la base de données pour supprimer les balises de paragraphe indésirables.

Répondre

1

J'utilise cette fonction de wordpress, enveloppements dans les parages p paragraphes bien ainsi que les sauts de ligne tout en préservant HTML:

function wpautop($pee, $br = 1) { 
    $pee = $pee . "\n"; // just to make things a little easier, pad the end 
    $pee = preg_replace('|<br />\s*<br />|', "\n\n", $pee); 
    // Space things out a little 
    $allblocks = '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)'; 
    $pee = preg_replace('!(<' . $allblocks . '[^>]*>)!', "\n$1", $pee); 
    $pee = preg_replace('!(</' . $allblocks . '>)!', "$1\n\n", $pee); 
    $pee = str_replace(array("\r\n", "\r"), "\n", $pee); // cross-platform newlines 
    $pee = preg_replace("/\n\n+/", "\n\n", $pee); // take care of duplicates 
    $pee = preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s', "<p>$1</p>\n", $pee); // make paragraphs, including one at the end 
    $pee = preg_replace('|<p>\s*?</p>|', '', $pee); // under certain strange conditions it could create a P of entirely whitespace 
    $pee = preg_replace('!<p>([^<]+)\s*?(</(?:div|address|form)[^>]*>)!', "<p>$1</p>$2", $pee); 
    $pee = preg_replace('|<p>|', "$1<p>", $pee); 
    $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); // don't pee all over a tag 
    $pee = preg_replace("|<p>(<li.+?)</p>|", "$1", $pee); // problem with nested lists 
    $pee = preg_replace('|<p><blockquote([^>]*)>|i', "<blockquote$1><p>", $pee); 
    $pee = str_replace('</blockquote></p>', '</p></blockquote>', $pee); 
    $pee = preg_replace('!<p>\s*(</?' . $allblocks . '[^>]*>)!', "$1", $pee); 
    $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*</p>!', "$1", $pee); 
    if ($br) { 
     $pee = preg_replace('|(?<!<br />)\s*\n|', "<br />\n", $pee); // optionally make line breaks 
    } 
    $pee = preg_replace('!(</?' . $allblocks . '[^>]*>)\s*<br />!', "$1", $pee); 
    $pee = preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!', '$1', $pee); 
    $pee = preg_replace("|\n</p>$|", '</p>', $pee); 
    return $pee; 
} 
+0

Je ne suis pas sûr de savoir comment cette fonction fonctionne mais elle fait certainement ce que je cherche. Serait intéressant de savoir si vous avez changé cela du tout de la version WordPress? – Darren

+0

Non, il s'agit d'une version légèrement ancienne, mais la fonction de la version la plus récente est presque identique et fait le même travail – fire

0

Vous pouvez utiliser la fonction strip_tags comme ceci:

<?php 
$text = '<p><h3>Test Header</h3></p>'; 
echo strip_tags($text); 
echo "\n"; 

// Allow <p> and <h3> 
echo strip_tags($text, '<p><h3>'); 
?> 

Il devrait fonctionner.

+0

Cette méthode est utile, certes, mais pas aussi complète que la fonction volée de WordPress. Merci! – Darren