preg_replace functie om H1 t/m 6 te replacen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ceasar Feijen

Ceasar Feijen

15/05/2010 16:20:31
Quote Anchor link
Hai,

Heb hier een functie om alle H1 t/m 6 te vervangen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$row
['korte_content'] = preg_replace('/().*.(<\/h[1-3]>)/i', '', $row['korte_content']);
?>

deze is geplaatst na de while($row = mysql_fetch_assoc($result)) {

Echter is deze functie vreselijk traag (0.6 sec.)
Doe ik dit
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$row
['korte_content'] = preg_replace('#(\<(h1|h2|h3)[^\>]*\>.*\</(h1|h2|h3)\>)#isU', "", $row['korte_content']);
?>

dan draait het als een speer (0.24 sec.)

wat is er fout aan de eerste preg_replace ?

Thanks

ps.
Hier nog een functie die goed werkt
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? $row['korte_content'] = preg_replace('|<h[1-9][^>]*>.*?</h[1-9][^>]*>|i', '', $row['korte_content']); ?>

Wat zijn de voordelen van de onderste twee voorbeelden ?
 
PHP hulp

PHP hulp

24/04/2024 10:10:30
 

15/05/2010 17:00:30
Quote Anchor link
Die eerste klopt sowieso niet, je hebt een lege capture group, dan mag er alles nul of meerdere keren gematcht worden, nog en iets en dan een h tag. Er schuilt geen logica in die regex, door die dot operator met die greedy match wordt ie waarschijnlijk heel traag. Hij matcht ook verkeerd.
Die tweede is beter, want je hebt daar maar drie mogelijkheden, verder houd je er ook rekening mee dat er dus een id o.i.d. aan de tag toegevoegd kan zijn. Ondanks dat er in sommige cheatsheets staat dat je < en > moet escapen, hoeft dat dus niet. Verder gebruik je de U modifier, die er voor zorgt dat je ungreedy matcht. Deze matcht ook verkeerd.
De derde is hetzelfde als de tweede, alleen zijn de escapes weggehaald, heb je hem ungreedy gemaakt en mag de sluit h tag ook meer inhoud bevatten.

Edit: Ik vind dit de beste regex:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php //Kleurtjes
$subject = '<h1 id="test">test</h1> test <h2>test</h2> test test <h3 id="tesst">blaat<span id="test">test</span></h3>';
$result = preg_replace('%<(h[1-6])[^>]*>([^\1]*)</\1>%', '\2', $subject);

var_dump($result);
[
/code]
Heb hem niet op snelheid getest. Wat wil je berhaupt eigenlijk doen? Kan je misschien niet beter [php]strip_tags[/php] gebruiken?
Gewijzigd op 15/05/2010 17:20:03 door
 
Ceasar Feijen

Ceasar Feijen

15/05/2010 18:01:13
Quote Anchor link
Wat ik wil doen is een overzichts pagina ophalen in een cms
In het block komt dan de titel te staan met daarna 250 woorden met lees meer
Vaak staat in het artikel bovenaan een H1 met dezelfde tekst als de title (voor goede SEO)
In het verkorte block moet dan dus die H1 (2,3 ect.) eruit en uiteraard daarna strip_tags
Heb nu deze
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$row
['korte_content'] = preg_replace('~<(h[1-6])(?=[\s>])[^<>]*>([^<]*(?:<(?!/\1)[^<]*)*)</\1>~' , '', $row['korte_content']);
?>

Voor mij is snelheid in dit cms het belangrijkste :)
Ben bezig met een supersnel cms die toch voldoende functies bevat. Snelheid zover 0.30 seconden per pagina
Gewijzigd op 15/05/2010 18:03:21 door Ceasar Feijen
 

15/05/2010 19:34:46
Quote Anchor link
Caesar:
In het verkorte block moet dan dus die H1 (2,3 ect.) eruit en uiteraard daarna strip_tags

En waarom kan dat dan niet direc in één keer? Als je die strip_tags er toch nog overheen gooit...
 
Ceasar Feijen

Ceasar Feijen

15/05/2010 20:47:59
Quote Anchor link
Je hebt gelijk :)
Alles nu in een functie
Thanks
 

15/05/2010 20:59:44
Quote Anchor link
Ik bedoel, waarom niet in één keer strip_tags er overheen dumpen. Klaar!
Je kunt wel leuk die headers eruit gaan filteren, dat doet strip_tags ook. Waarom moet jij het dan ook nog eens apart doen? Test het anders eens, met alleen strip_tags...
 
Ceasar Feijen

Ceasar Feijen

15/05/2010 21:35:24
Quote Anchor link
Ik denk dat je het niet helemaal begrijpt.
Ik wil niet alleen alle tags eruit hebben maar ook de inhoud van een H1
vb. <h1>Dit moet er ook uit</h1>
 
Joakim Broden

Joakim Broden

15/05/2010 21:46:21
Quote Anchor link
Even tussen door, is er toevallig ook een functie die alle tags er uithaalt op de headings na? Dus h1 h2 h3 etc laten staan en de rest er uit?
 
Ceasar Feijen

Ceasar Feijen

15/05/2010 21:53:10
Quote Anchor link
Misschien wel dus met strip_tags

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$text
= '<h1>Test paragraph.</h1><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";

// Allow <h>
echo strip_tags($text, '<h1><h2><h3>');
?>
Gewijzigd op 15/05/2010 21:54:52 door Ceasar Feijen
 

15/05/2010 22:40:09
Quote Anchor link
Caesar:
Ik denk dat je het niet helemaal begrijpt.
Ik wil niet alleen alle tags eruit hebben maar ook de inhoud van een H1
vb. <h1>Dit moet er ook uit</h1>


Ah, jah, dat was niet geheel duidelijk. Ik geloof niet dat die regex van jou hierboven sneller is dan die van mij, bij die van mij moet je alleen effe die \2 in de replace weghalen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.