ik heb een regex maar hij werkt niet




$str="<table>";

$subject = $str;
$pattern = '/<[^>]*>/';
preg_match($pattern, $subject, $matches);
print $matches[0];


Werkt hier prima, als het resultaat <table> moet zijn. :-)

Wees anders even wat duidelijk in het vervolg. Een 'het werkt niet' bestaat praktisch niet. Altijd gebeurt er wat, en dat het werkt. Maar het geeft misschien de verkeerde en onverwachte uitkomst.

Dus wees gewoon concreet in je bericht wat er gebeurt, wat zie ziet, en wat je verwacht. Probeer in je hoofd dus van te voren zoveel mogelijk vragen te beantwoorden voor in dit topic.
bedankt voor het antwoord. Ik heb de code in een losse pagina opgeslagen maar krijg geen resultaat.


Zou toch moeten werjen

[size=xsmall]Toevoeging op 24/02/2026 01:59:36:[/size]

hij doet het wel

de uitkomst is natuurlijk html die ik niet in de pagina zag

vergat in de source te kijken.




In dit geval haal je dus de hele string op die je invoert.

Maar wat wil je als er meer tekst is? Of wat als er meerdere <tags> zijn, al dan niet genest?

<?php
$str="meer tags, <table id="foo"><tr></tr></table> afsluitende tekst";

$subject = $str;
$pattern = '/<[^>]+>/';
preg_match($pattern, $subject, $matches);
print htmlspecialchars($matches[0]);
?>

Ik neem ook aan dat je <> niet wilt hebben? (daarom een + waar jij een * zet)

Of is de controle alleen dat je puur en alleen één tag in de invoer hebt staan?

<?php
$str="table zalwel table iets table table";
echo $str. "<br><br>";
$subject = $str;
$pattern = '/table^(table)table';
preg_match($pattern, $subject, $matches);
print $matches[0]; 
?>


ik probeer nu.dit gedeelte:

'table zalwel table"

eruit te krijgen maar het lukt niet

[size=xsmall]Toevoeging op 26/02/2026 13:13:37:[/size]


<?php
$str="table zalwel table iets table table";
echo $str. "<br><br>";
$subject = $str;
$pattern = '/table^(table)table';
preg_match($pattern, $subject, $matches);
print $matches[0]; 
?>


ik probeer nu.dit gedeelte:

'table zalwel table"

eruit te krijgen maar het lukt niet

[size=xsmall]Toevoeging op 26/02/2026 13:16:55:[/size]

de zin is trouwens



table zalwel table table iets table

Je pattern met een begrenzingsteken hebben. Vaak wordt de / gebruikt, soms een ~. Zelf geef ik (ivm vaak combineren met htmlcode waarin al vaak een / zit) de voorkeur aan #

<?php
$pattern = '# table #';
?>

dat stuk tussen de # moet nog ingevuld worden. Maar ik kan niet opmaken uit het geheel wat je nu probeert te vinden.

"eruit krijgen" kun je opvatten als "dat is het antwoord dat ik wil hebben". Maar ook als "de hele invoer, maar met dat stukje eruitgesneden"

Voor optie 1:
<?php

$str="table zalwel table iets table table";
echo $str. "<br><br>" .PHP_EOL;
$subject = $str;
$pattern = '#(table.*?table)#';
preg_match($pattern, $subject, $matches);
print $matches[1];
?>

Waarbij je ook nog een ^ zou kunnen plaatsen tussen de # en ( in de $pattern definitie als je wilt afdwingen dat de string begint met "table"en er niets voor staat.

$matches[0] geeft de hele invoer terug. Dat wil je niet, je wilt [1] hebben: datgene dat tussen het eerste paar ( ) staat. (en zo zal [2] je bij een tweede set ( ) de match daarvan geven)
ik probeer een willekeurig aantal tabbellen, gevolgd door de gewenste tabel, gevolgd door weer een aantal tabellen te matchen.


<?php
$str="table v table table e table table zalwel name=grid table table iets table table iet table";
echo $str. "<br><br>" .PHP_EOL;
$subject = $str;
$pattern = '/(table.*?table *)* (table.*?name=grid.*?table) (table.*table)*/';
preg_match($pattern, $subject, $matches);
print $matches[2];
?>


de uitkomst zou moeten zijn:
table v table table e table
table zalwel name=grid table
table iets table table iet table

maar ik krijg
table e table
table zalwel name=grid table
table iets table table iet table
dus je weet dat de string begint met 1 of meer tables die samen gevonden worden.

Daarna is er een table die de property name=grid heeft
en tenslotte nog 1 of meer tables.

<?php
$pattern = '#(table.*table)\s+(table.*?name=grid.*?table)\s+(table.*table)#';
?>
We vinden nu door (table.*table) waarbij geen ? achter .* staat zo veel mogelijk tables. De ? staat voor ungreedy. Die ? heb ik verwijderd en daardoor zoekt hij zo ver mogelijk door.

Daarna staat er (table.*?name=grid.*?table)

Dat betekent dat de eerste grep stopt op het moment dat er een table is met name=grid.
De *? zoekt vanwege de ? naar de eerstvolgende table als afsluiter.

Tenslotte zoeken we nog greedy naar de volgende table waarbij de allerlaatste table de afsluiter is.
Dat kan niet in de herhaling gaan: die laatste * heeft dus geen zin: we zijn bij de eerste keer al direct bij de laatst table aangeland.
thanx voor de reactie. ik begrijp het.

nog een vraag.

als je het non-greedy wil doen,

waarom werkt dit dan niet?

(table.*?table *)*

[size=xsmall]Toevoeging op 28/02/2026 19:03:11:[/size]


<?php
$str="table v table table e table table zalwel name=grid table table iets table  table iet table";
echo $str. "<br><br>" . PHP_EOL;
$subject = $str;
$pattern =  '/((table.*?table ?)*) (table.*?name=grid.*?table) (table.*table)*/';
preg_match($pattern, $subject, $matches);
print $matches[1] . "<br>";
print $matches[2] . "<br>";
print $matches[3];
?>



dit lijkt te werken.
ik zou alleen $matches[2] eruit willen hebben. Kan dat met ander soort haken?
ik heb de volgende regex:


<?php
$str="table v table table e table";
echo $str. "<br><br>" . PHP_EOL;
$subject = $str;
$pattern =  '/((table.*?table ?)*)/';
preg_match($pattern, $subject, $matches);
print $matches[1] . "<br>";
print $matches[2] . "<br>";
?>


dit geeft:
table v table table e table
table e table

op zich werkt dit goed.
ik zou alleen output2 niet naar het scherm willen hebben


ik dacht aan:

$pattern =  '/(?(table.*?table ?)*)/';


maar het werkt niet



[size=xsmall]Toevoeging op 01/03/2026 13:57:29:[/size]

ik heb het inmiddels


$pattern =  '/((?:table.*?table ?)*)/';
misschien is het handig om 1 of meer test-strings te hebben, en even zo veel gewenste uitkomsten te noteren.

Nu verandert steeds de inputstring en is het maar raden welke uitkomst je wenst.
En vooral waarom je dat stuk wilt hebben. (dus welke reden er is: is het het voorlaatste, is het die waar de tekst tussen table en table uit meer dan 1 letter bestaat etc.)

Reageren