[PHP, MySQL] Strip tags of database opschonen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bananenspin
  • Registratie: December 2008
  • Laatst online: 13-08 15:52

Bananenspin

Omdat het kan

Topicstarter
Voor een klant ben ik momenteel bezig met zijn website technisch te vernieuwen. Nou moet er dus gewerkt worden met de huidige database en dat levert nogal wat probleempjes op omdat deze niet slim is ingedeeld. Een van de problemen die ik nu tegen kom is dat de database ook html tags bevat. Bijvoorbeeld:

HTML:
1
2
<p style="text-align: justify;">Stuk tekst hier<a href="http://tweakers.net" target="_blank">Link naar.</a> en dan nog meer tekst hier</p>
<p style="text-align: justify;">Volgende regel is dan hier met nog meer tekst.</p>


Nou omdat ik voor een stukje alleen maar de eerste 50 characters hoef op te halen doe ik LEFT(content, 50) AS content maar dat pakt natuurlijk ook de HTML codes mee. Ook word er gek genoeg niet altijd begonnen met HTML code dus het aantal characters ophogen gaat ook niet werken. Als ik de database ga opschonen moet de ik de <a> tags ongemoeid laten maar natuurlijk de tweede <p> tags ook. Dit lijkt me de beste optie maar hoe?

Met strip tags los ik het slordig op maar dan laat je eigenlijk weer een onnodige functie het werk doen. Ook is het natuurlijk netter om de code schoon te hebben voor de pagina waarop het volledige nieuws artikel te bekijken valt. So any help is appreciated!

HOI.


Acties:
  • 0 Henk 'm!

  • Keiichi
  • Registratie: Juni 2005
  • Laatst online: 22-09 20:38
Misschien dat je in PHP wat met DOM kan doen om de tekst tussen de html tags uit te pakken. (Of regex als je van een uitdaging houd ;) )

Solar @ Dongen: http://solar.searchy.net/ - Penpal International: http://ppi.searchy.net/


Acties:
  • 0 Henk 'm!

Verwijderd

Je kunt een extra kolom aanmaken die "plain_text:" ofzo heet, daarin zet je de volledige tekst maar dan met strip_tags eroverheen gehaald. Dan kun je gewoon LEFT(plain_text, 50) doen.

Acties:
  • 0 Henk 'm!

  • Bananenspin
  • Registratie: December 2008
  • Laatst online: 13-08 15:52

Bananenspin

Omdat het kan

Topicstarter
Van DOM heb ik geen kaas gegeten en van uitdagingen houd ik wel maar regex ook nog nooit gebruikt!

Een extra kolom heb ik ook over nagedacht wat het probleem zou oplossen voor inderdaad het korte stukje tekst die ik nodig heb. Alleen houd ik dan het probleem bij een pagina waar ik alle tekst nodig heb ik nog steeds met die (naar mijn mening) onnodige tags. Ik heb ze er liever uit zodat ze in de toekomst altijd nog kunnen worden aangepast (welliswaar hardcoded maar goed).

HOI.


Acties:
  • 0 Henk 'm!

Verwijderd

Als je de tags er uit wil is er volgens mij toch geen probleem? Je laat een script lopen die alles update naar tagloze input. Dan kun je zo met LEFT(content, 50) werken.

Acties:
  • 0 Henk 'm!

  • Bananenspin
  • Registratie: December 2008
  • Laatst online: 13-08 15:52

Bananenspin

Omdat het kan

Topicstarter
Nou het probleem zou nu zijn dat ik alleen de eerste <p> eruit wil vissen als die bestaat en de rest van de tags mogen intact blijven. Nog even uitzoeken hoe dit kan.

HOI.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Bananenspin schreef op zaterdag 16 juli 2011 @ 15:49:
Nou het probleem zou nu zijn dat ik alleen de eerste <p> eruit wil vissen als die bestaat en de rest van de tags mogen intact blijven. Nog even uitzoeken hoe dit kan.
Ik zou toch de tip van teuneboon nog eens goed nalezen want dat is de enige manier waarop je dit ooit fatsoenlijk werkend gaat krijgen. En als je dan toch opmaak in de "abstract" wil, dan sla je 't niet als "plain text" op maar (net als de content) als HTML in een apart veld waarin je de "redactie" vertelt een abstract (al dan niet opgemaakt) in te voeren.
Een functie schrijven die zelf een "abstract" trekt uit de eerste zoveel tekens HTML gaat nooit fatsoenlijk werken; Ik kan, bij wijze van, al 5k aan HTML produceren voordat er überhaupt content komt. Of wat als er <script> tags in de eerste paar tekens voorkomen die script bevatten die, op de "volledige weergave" pagina, prima werken maar in 't overzicht niet? En ga zo maar door.

[ Voor 48% gewijzigd door RobIII op 16-07-2011 16:29 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Die 'LEFT()' gaat in geen geval werken als je tags in de database hebt, het einde kan namelijk net zo goed in je tag vallen dat je zoiets krijgt als
HTML:
1
... Stuk tekst hier<a href="http://t

Ga je dan de gehele link weglaten? Wat als de tekst begint met een link die 60 karakters lang is?
Hoe ga je de tags dan terug sluiten, een dom parser kan er volgens mij niets meer mee omdat je geen geldige html/xml meer hebt?

Ik heb hier ooit een class voor gemaakt (class van op web aangepast) die enkel tekst als karakter telt en uiteindelijk ook de tags afsluit. Anders heb je plots geen geldige html meer.
Het kwam er op neer dat ik de volledige tekst naar php overhaalde en daar met een dom parser over de tekst ging.

Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Bananenspin schreef op zaterdag 16 juli 2011 @ 12:56:
Van DOM heb ik geen kaas gegeten en van uitdagingen houd ik wel maar regex ook nog nooit gebruikt!
En jij kan wel de site technisch vernieuwen?

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Nu online

alienfruit

the alien you never expected

Misschien kan je overwegen om het door HTMLPurifier te laten lopen? Die haalt de meeste Word bagger e.d. ook weg.

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Als het de bedoeling is dat er html-tekst in de database staat, dan zou ik dat niet zomaar anders op gaan slaan. Een snippet presenteren aan de hand van de content moet ook redelijk lukken door de hele tekst op te halen en in php dmv strip_tags te ontdoen van html en daarna pas te bewerken. Dat heeft als voordeel dat je evt ook iets als wordwrap kan gebruiken om een netter afbreekpunt te vinden.

Als je dat heel vaak moet doen, kan je overwegen om die snippet zelf los bij de data op te slaan (bij wijze van denormalizatie).

Acties:
  • 0 Henk 'm!

  • TheMe
  • Registratie: December 2006
  • Laatst online: 08-07 20:51
:+

Lijkt wel of ik mijn eigen probleem lees. Ben zelf bezig met mijn eigen site en loop tegen hetzelfde probleem aan. Zelf zit ik te kijken naar de volgende oplossing: $needle in $haystack

Zoeken naar een $needle (in dit geval <a href) in een string ($blogtekst). Als de $needle gevonden is kijken of de html sluittag (</a>) voorkomt in string. Als die er niet inzit wil ik de string $blogtekst verlengen, todat de html sluittag wel gevonden wordt.
Dan heb je een leuke snippet met werkende link, zoals het bedoeld was.

Best omslachtig, maar ik ben een php hobbyist, geen purist. Bovendien werk ik aan mijn eigen site, niet voor (betalende) klanten.

Overigens geen idee of het uiteindelijk goed werkt.

[ Voor 4% gewijzigd door TheMe op 18-07-2011 10:08 ]

There is no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Voor zowel ts als bovenbuurman: Voor html volstaat regex al niet, dus denken dat je er met een left of ander spartaanse stringfunctie altijd uit komt is een beetje naief.

{signature}


Acties:
  • 0 Henk 'm!

  • TheMe
  • Registratie: December 2006
  • Laatst online: 08-07 20:51
@ TS:
Heb je je probleem al opgelost?
Ik heb na behoorlijk wat worstelen devolgende code uitgepoept:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function got_opentag($str) {                
    return (preg_match('#<a#', $str));
} 

function got_endtag($str) {                 
    return (preg_match('#</a>#', $str));
} 

$sql_connect;

$sql = "SELECT * FROM blog WHERE datum LIKE '%2011%' AND tonen = '1' ORDER BY datum DESC LIMIT 1,1";
$resultaat = mysql_query($sql);
      while ($rij = mysql_fetch_array($resultaat)) {
      
            $i = 175;
            $string = substr($rij["tekst"], 0, $i);
            
            
if (got_opentag($string)) {
     while (!got_endtag($string)) {
                $string = substr($rij["tekst"], 0, $i);
                $i++;
                    }
                    echo $string."<br>";
                                
                } else { 
                echo $string;
                }

[ Voor 4% gewijzigd door TheMe op 25-07-2011 21:57 ]

There is no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Nu gebruik je preg_match() voor iets dat met strpos() zou kunnen, en mijn vorige post geldt nu ook voor de onderbuurman. :>

{signature}


Acties:
  • 0 Henk 'm!

  • TheMe
  • Registratie: December 2006
  • Laatst online: 08-07 20:51
Ik begrijp dat het semantisch misschien niet mooiste oplossing is, maar preg_match doet in dit geval wat ik wil. En in mijn prive, niet commercieel bedoelde scripts kan ik hiermee wel uit de voeten.

There is no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • Bananenspin
  • Registratie: December 2008
  • Laatst online: 13-08 15:52

Bananenspin

Omdat het kan

Topicstarter
Sorry voor de mensen die gereageerd hebben vorige week maandag, had geen reacties meer verwacht! Heb het ondertussen maar opgelost door het op te halen en strip_tags erover heen te gooien, in ieder geval tijdelijk. Dit werkt nog niet voor de pagina waar een artikel los op stond maar hier verzin ik nog wel wat op.

@ TheMe het is een oplossing ja, maar voor mij niet en erg netjes is het ook niet :p

HOI.


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
TheMe schreef op maandag 25 juli 2011 @ 23:08:
Ik begrijp dat het semantisch misschien niet mooiste oplossing is, maar preg_match doet in dit geval wat ik wil. En in mijn prive, niet commercieel bedoelde scripts kan ik hiermee wel uit de voeten.
Wil je op 20 november geen blogposts maken? Of moeten ze dan speciaal behandeld worden? Oftewel waarom like %2011% (extreem inefficient en apart)
En tja, die regex ziet er heel leuk uit, maar wat gebeurt er met je pagina als je er de volgende html tegenaan gooit :
HTML:
1
<a href="...."><h1>Hallo dit is een test</a></h1>

Of images in een href zetten, dat geeft waarschijnlijk ook mooie resultaten.
Of je html-tags (anders dan <a> dus) precies over de grens van 175 tekens laten lopen.

doe dan minimaal iets als :
PHP:
1
strip_tags($text, '<a>');

als het uit je db komt voor je snippets.

Acties:
  • 0 Henk 'm!

  • TheMe
  • Registratie: December 2006
  • Laatst online: 08-07 20:51
Iemand die op de PHP school heeft gezeten kan zeker veel nettere code schrijven. Ben toch wel van mening dat het wel werkt. Wat er 20 november gebeurt, dat zie ik dan. Vooralsnog heb ik geen speciale plannen voor het schrijven van een blog op die datum.

Er komen geen andere html tags in de eerste 175 tekens. Daar hoe ik geen rekening mee te houden. Ik ben en blijf de enige gebruiker van mijn site. En je strip_tags tip is eigenlijk wel een goede.

Omdat ik niet naar de PHP school ben gegaan weet ik meer dan driekwart van dat soort trucs niet. Blijft hobbyen in de marge voor mij.

There is no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17:18

Janoz

Moderator Devschuur®

!litemod

Gomez zegt het niet voor niks. Ga maar eens nadenken wat er eventueel zou kunnen gebeuren op 20 november met die query.

Daarnaast gaat het hier niet om of iemand wel op 'een php school' (sic) heeft gezeten of niet. De mensen die hier reageren proberen anderen te helpen. Het gaat hier helemaal niet om trucs die je wel of niet moet kennen. Het gaat hier over (potentiele) bugs en/of brakke code die veel duidelijker en beter kan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1