Dit is een basis tutorial om te laten zien hoe je van een lap tekst een deel kan verwijderen. We zullen hiervoor twee functies gebruiken: strpos() en substr().
Voor deze tutorial zullen we een bullet-lijst uit een HTML-pagina filteren. Dit is de tekst:
1 2 3 4 5 6 | <p>Dit is een voorbeeldparagraaf</p> <ul> <li>Sla dit punt over</li> <li>Sla dit punt ook over</li> </ul> <p>En hier nog een voorbeeldparagraaf</p> |
Wat we uiteindelijk over willen houden is dit:
1 2 | <p>Dit is een voorbeeldparagraaf</p> <p>En hier nog een voorbeeldparagraaf</p> |
Geweldig. Nu we weten wat we willen kunnen we gaan kijken welke stappen we moeten ondernemen om dat voor elkaar te krijgen..
- Allereerst moeten we de originele tekst in een variabele opslaan, zodat we ermee kunnen werken.
- Dan moeten we uitzoeken waar de lijst begint in de tekst.
- We moeten ook weten waar die lijst eindigt.
- Dan moeten we het begin van de tekst hebben, tot aan het punt waar de lijst begint, en daar het eind van de tekst tegenaan plakken, beginnend vanaf het einde van de lijst.
Oke dan. Ik ga hier niet beschrijven hoe je een HTML-bestand moet openen en de inhoud moet uitlezen, ik ga ervanuit dat de tekst hard in het PHP script staat, of ergens door de gebruiker is ingevuld. We slaan deze tekst op in $original:
1 | $original = "<p>Dit is een voorbeeldparagraaf</p><ul><li>Sla dit punt over</li><li>Sla dit punt ook over</li></ul><p>En hier nog een voorbeeldparagraaf</p>"; |
Om het beginpunt van de <ul> en het eindpunt van de </ul> te vinden, gebruiken we de strpos() functie. Waarom heet dat ding strpos()? Omdat een variabele met een stuk tekst erin een “string” heet, en deze functie zoekt de positie van een teken of tekenserie (ook wel een “substring” genoemd) binnen een string.
Om de gewenste informatie te krijgen, moeten we de strpos()-functie twee blokjes informatie geven: de string waarin hij moet zoeken, en het teken of de substring om naar te zoeken. In die volgorde.
OPMERKING: Deze functie is hoofdlettergevoelig. Met andere woorden, als je naar “<ul>” in kleine letters zoekt, maar het HTML-bestand bevat “<UL>” in hoofdletters, wordt het niet gevonden. Je zou dan stripos() kunnen gebruiken, die functie doet hetzelfde als strpos(), maar is niet hoofdlettergevoelig.
Dus, om in onze HTML-string de positie te vinden waar de lijst begint, moeten we dit doen:
1 | $listStartingPoint = strpos($original, "<ul>"); |
Weet je nog dat $original de HTML-code bevat? Mooi.
Nu moeten we de positie in onze HTML-string vinden waar de lijst eindigt. Dit gaat op precies dezelfde manier:
1 | $listEndingPoint = strpos($original, "</ul>"); |
Er is nu wel een klein probleem met onze $listEndingPoint. En dat probleem is: het is nu de positie in onze HTML-string waar de tekst “</ul>” begint. Wat we willen weten, is waar “</ul>” eindigt. Gelukkig weten we dat “</ul>” uit vijf tekens bestaat, dus we kunnen dat optellen bij het resultaat van strpos():
1 | $listEndingPoint = $listEndingPoint + 5; |
Nu dat we weten waar de lijst begint en eindigt, kunnen we de substr()-functie gebruiken om de tekst daaromheen te pakken te krijgen. Ik zei eerder al dat een stuk tekst een string heet. Een string binnen een string heet een substring. De substr()-functie geeft zo’n substring terug, vandaar de naam van de functie.
Allereerst willen we de substring vanaf het begin van de tekst tot aan het beginpunt van de lijst. Om dat te doen moeten we de substr()-functie drie blokjes informatie geven: de string waar een stuk uitgehaald moet worden, waar de substring begint, en waar de substring eindigt. Dit laatste blokje is optioneel, zoals we later zullen zien.
Er is één heel belangrijk ding wat je moet onthouden over PHP (en eigenlijk over zo’n beetje alle andere programmertalen die bestaan): ze beginnen bij nul met tellen. Mensen hebben de neiging om bij één te beginnen met tellen, wat eigenlijk vrij stom is, want dan kan je nooit op een half (0,5) komen. Hoe kan iets nou bijvoorbeeld een halve seconde duren, als je bij één begint met tellen? Computers doen het goed, en beginnen bij nul.
De reden dat ik dit hier zeg, is omdat onze substring bij het begin, of het eerste teken, van de originele string moet beginnen. Omdat PHP bij nul begint met tellen, heeft dat eerste teken een positie van 0 in de originele string.
1 | $beforeList = substr($original, 0, $listStartingPoint); |
$beforeList bevat nu de substring van onze oorspronkelijke HTML-code, van het eerste teken, tot aan het punt waar de lijst begint.
Om het deel van de HTML code vanaf het eind van de lijst tot aan het eind van de string te krijgen, moeten we tegen de substr()-functie vertellen dat hij niet moet stoppen. Dat doen we door simpelweg niet te zeggen waar hij moet stoppen. Dus:
1 | $afterList = substr($original, $listEndingPoint); |
$afterList bevat nu de substring van $original, vanaf het punt waar de lijst eindigt, tot aan het eind van $original.
Als laatste stap moeten we de $beforeList en $afterList substrings samenvoegen, zodat we één string hebben die alles bevat wat we willen hebben. Dat kan niet makkelijker. Zet gewoon een punt tussen ze in:
1 | $withoutList = $beforeList . $afterList; |
$withoutList bevat nu “<p>Dit is een voorbeeldparagraaf</p><p>En hier nog een voorbeeldparagraaf</p>”, en dat is precies wat we willen.
Maar wat nou als we precies het tegenovergestelde wilden bereiken? Wat nou als we juist de lijst wilden bewaren, en de rest wilden verwijderen? Nou, we hadden dan nog steeds dezelfde informatie nodig gehad, namelijk het begin- en eindpunt van de lijst. Vervolgens moeten we uitzoeken hoe lang de string is die we willen hebben:
1 | $listSize = $listEndingPoint - $listStartingPoint; |
Nu we dat weten, kunnen we een andere substring uitvoeren:
1 | $listOnly = substr($original, $listStartingPoint, $listSize); |
$listOnly bevat nu de substring van $original, vanaf het beginpunt van de lijst, tot aan het eindpunt van de lijst.
Om het geheel af te maken, hier nog een keer allebei de scripts in hun geheel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // Neem het originele stuk tekst waar een een stuk uit willen hebben $original = "<p>Dit is een voorbeeldparagraaf</p><ul><li>Sla dit punt over</li><li>Sla dit punt ook over</li></ul><p>En hier nog een voorbeeldparagraaf</p>"; // Zoek het beginpunt van de lijst in de originele string $listStartingPoint = strpos($original, "<ul>"); // Zoek het eindpunt van de lijst in de originele string $listEndingPoint = strpos($original, "</ul>"); // Dit is nu het BEGINPUNT van </ul>, maar we willen weten wat // het EINDPUNT van </ul> is, en dat is vijf tekens verderop $listEndingPoint = $listEndingPoint + 5; // Haal de substring op vanaf het begin van de tekst, tot aan het // begin van de lijst $beforeList = substr($original, 0, $listStartingPoint); // Haal de substring op vanaf het eind van de lijst tot aan het eind // van de originele string $afterList = substr($original, $listEndingPoint); // Plak de twee substrings achter elkaar $withoutList = $beforeList . $afterList; |
En om alleen de lijst over te houden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // Neem het originele stuk tekst waar een een stuk uit willen hebben $original = "<p>Dit is een voorbeeldparagraaf</p><ul><li>Sla dit punt over</li><li>Sla dit punt ook over</li></ul><p>En hier nog een voorbeeldparagraaf</p>"; // Zoek het beginpunt van de lijst in de originele string $listStartingPoint = strpos($original, "<ul>"); // Zoek het eindpunt van de lijst in de originele string $listEndingPoint = strpos($original, "</ul>"); // Dit is nu het BEGINPUNT van </ul>, maar we willen weten wat // het EINDPUNT van </ul> is, en dat is vijf tekens verderop $listEndingPoint = $listEndingPoint + 5; // Bepaal de hoeveelheid tekens van <ul> tot het einde van </ul> $listSize = $listEndingPoint - $listStartingPoint; // Haal de substring op van het begin van de lijst tot aan het eind // van de lijst $listOnly = substr($original, $listStartingPoint, $listSize); |
Recente reacties