Regex gevraagd

Status
Niet open voor verdere reacties.

pieter53

Gebruiker
Lid geworden
1 jan 2007
Berichten
297
Het is natuurlijk een luie oplossing jullie om hulp vragen,
maar op mijn oude dag leer ik niet zo makkelijk meer en na twee dagen lang puzzelen geef ik het maar op.

Ik had
$re_match_title = '<title>([^<]*)<\/title>';

Maar wegens wijzigingen in mij website wil ik nu onderstaande drie gevallen als titel kunnen gebruiken.

1. <h1>Titel van het document</h1>
2. <h1>Titel van het document</h1> <h3>Subtitel</h3>
3. <h1>Titel van het document</h1><br>
<h3>Subtitel</h3>



Als het goed is komen <h1> en <h3> maar éénmaal voor in het document.
Dus het moet zoiets zijn als beginnen met <h1> en dan alles tot en met </h1>of</h3>.

Is er iemand die dat voor mij wilt oplossen?
Alvast heel erg bedankt.
 
Vanwaar die <br> terwijl headings al een block-level element zijn?
 
Als het block-level elementen zouden zijn dan zou ik een bepaalde opmaak niet kunnen realiseren.
Via het stylesheet worden het inline elementen.
 
Is dat niet een beetje apart? Het komt meer over alsof het een ranzige work-around is?
Ik zou geen redenen zien waarom je in-line voor heading wilt gebruiken?
 
Met <h1>(.*)<\/h[3|1]> kom ik een heel eind....
Okay in het geval van: <h1>Stuurhutten</h1> <br> <h3>Passagiersschepen</h3>
maar niet met een nieuwe regel er tussen
<h1>Stuurhutten</h1> <br>
<h3>Passagiersschepen</h3>

Als dat moeilijk op te lossen is, dan zal ik de bestanden maar aanpassen.
 
1. <h1>Titel van het document</h1>
2. <h1>Titel van het document</h1> <h3>Subtitel</h3>
3. <h1>Titel van het document</h1><br>
Staat het zo in de html (geen spaties om tags + niet verdeeld over regels)
Code:
<h1>Titel van het document</h1><h3>Subtitel</h3>

of is dit van tevoren onbekend en zou het bijvoorbeeld zo kunnen zijn
Code:
<h1>Titel van het document</h1>
  <h3>Subtitel</h3>
 
Ik ben slordig geweest, maar denk het tot de drie genoemde varianten beperkt te hebben.
Dat zijn dus:
1. <h1>Titel van het document</h1>
Geen spaties tussen tags en tekst.

2. <h1>Titel van het document</h1> <h3>Subtitel</h3>
Geen spaties tussen tags en tekst wel een spatie tussen </h1> en <h3>

3. <h1>Titel van het document</h1><br>
<h3>Subtitel</h3>
Geen spatie tussen tags, of tussen tags en tekst, maar een nieuwe regel na <br>
 
Laatst bewerkt:
Als voorbeeld een regex voor <h1>Titel van het document</h1> <h3>Subtitel</h3>
Code:
<h1.*[^>]+.*<\/h3>/is

i : niet hoofdlettergevoelig
s : regex werkt ook als tekst is verdeeld over meerdere regels.

Test het even op https://regexr.com/

update. ik dacht dat je zo de modifiers i + s kan toevoegen
Code:
preg_match("/<h1.*[^>]+.*<\/h3>/is", $mijn_titel, $matches);
 
Laatst bewerkt:
Bedankt voor de moeite.
Getest op https://regex101.com/r/dmRygT/1
en hier wil het met /is toevoeging niet werken.
Dat is een foutje van mij!
Regex101.com had zelf al
Code:
 /is
toegevoegd.
In https://regexr.com/ lijkt het te werken.
Morgen eens echt testen.

Ik denk dat ik met Notepad++ toch maar een beetje meer uniformiteit in mijn titels aan moet brengen.
 
Laatst bewerkt:
Met de regex hierboven wordt alles vanaf de eerste h1 tot en met de laatste /h3 (en alles ertussen) geselecteerd, bijvoorbeeld hieronder wordt in z'n geheel geselecteerd.
Code:
[B]<h1>[/B]Titel document</h1>  <h3>Subtitel</h3>
<p>Hier staat tekst <br>en dit op de volgende regel</p>
<h3>Koptekst van paragraaf[B]</h3>[/B]
 
Als je controle wilt dat alleen de eerste match wordt gepakt (het maakt niet uit of er meerdere h1's en h3's zijn) dan werkt dit

<h1 class="title">
Titel van document</h1>
<h3>Subtitel onder titel</h3>

Code:
<h1[^>]*>[^<]*<\/h1>[\s\n\r]*<h3[^>]*>[^<]*<\/h3>

Er mogen dan geen elementen in de h1 en h3 staan zoals <span> of <strong> of <br> enz.
 
Bedankt voor de hulp!
Even chronologisch.
Diverse expressies geprobeerd met /i/s of \i\s of /is of \is dat geeft meteen bij het uitvoeren van PHP een foutmelding.
Dan <h1[^>]*>[^<]*<\/h1>[\s\n\r]*<h3[^>]*>[^<]*<\/h3> geprobeerd. Dat gaf een onregelmatig en gefragmenteerd resultaat.
Ook <h1>(.*)<\/h[3|1]> geprobeerd. Dat geeft tot nu toe de meeste juiste resultaten. Ongeveer 10% van de bestanden (ca.100) geeft een incomplete titel, dus dat is handmatig wel te corrigeren.
\s\n\of\r er tussen voegen lukte me niet zonder slechtere resultaten te krijgen.
Ik zal trouwens de grootte van het veld titel aan moeten passen, want dat is een enkele maal te krap. (te zuinig geweest...)
Tot zover
 
Dit werkt bij mij, alleen h1 en h3 worden vervangen door een andere h1 en h3
Code:
<?php

$bodyText = '<div class="header">
<img src="logo.jpg" alt="logo">
<H1>Welkom op website</h1>
<h3>Deze website geeft info
</H3></div>';

$pattern = '/<h1[^>]*>[^<]*<\/h1>[\s\n\r]*<h3[^>]*>[^<]*<\/h3>/si';

$replaceWith = '<h1>Nieuwe titel</h1><h3>Nieuwe omschrijving</h3>';

echo preg_replace($pattern, $replaceWith, $bodyText);

?>
 
Ik zal het proberen. Dat kan even duren, want ik heb even een paar urgente zaken.
 
Het oponthoud duurde gelukkig niet al te lang.
$pattern in mijn bestand geplakt.
Hieronder een deel van dat bestand.

PHP:
$re_match_title = '/<h1[^>]*>[^<]*<\/h1>[\s\n\r]*<h3[^>]*>[^<]*<\/h3>/si';
	
$re_match_anchor = '<a\s([^>]*)>';
$re_match_name = 'id="([^"]*)"';

$input = @file_get_contents($fname);
if ($input === false) return 0;

if (preg_match("/{$re_match_title}/siU", $input, $matches)) { 
	if (isset($matches[1])) {
		$title = html_entity_decode($matches[1]);
	}
}
echo "<p>$title</p>";

Het resultaat valt erg tegen.
Er wordt erg veel over geslagen
Komt dat door het gebruik van preg_match??
 
Oops, ik zie nu dat je preg_match gebruikt maar het gaat om de regex patterns
PHP:
// vervuilde test code
$body = '<div class="header">
<img src=logo.jpg alt="logo">
<H1 class="titel"> Welkom op website</h1>
  <h3 class="prod">Onze producten pagina
</H3> <br />Tekst<br><br /><br>Meer tekst</div>';

// regex patterns
$regTT = '<title>[^<]*<\/title>';
$regH1 = '<h1[^>]*>[^<]*<\/h1>';
$regH3 = '<h3[^>]*>[^<]*<\/h3>';
$regBR = '<br\s?\/?>';

// $regTT (of $regH1 of $regH3)
$pattern = '/' . $regTT . '/is';

// h1 met h3
$pattern = '/' . $regH1 . '\s*' . $regH3 . '/is';

// h1 met br
$pattern = '/' . $regH1 . '\s*' . $regBR . '/is';

// voorbeeld
$body = preg_replace($pattern,'Nieuwe html/tekst', $body);

echo $body;
 
Laatst bewerkt:
Heel erg bedankt voor de moeite.
Het duizelt me echter een beetje want op het ogenblik wordt ik (vooral geestelijk) te veel in beslag genomen door heel andere problemen.
Ik kan daardoor op dit moment niet overzien of het verstandig is om op de bestaande situaties voort te borduren
of dat ik maar beter 'schoon schip' kan maken.
Voor de de huidige presentatie van zoekresultaten op mijn website gebruik ik de bestandsnaam als titel, wat natuurlijk de nodige beperkingen met zich mee brengt.
Niet echt fraai maar er valt mee te leven.
Het geeft me wel de mogelijkheid om achter de schermen rustig aan 'echte titels' te werken.
Nogmaals dank voor de hulp! Ik heb in ieder geval weer het nodige geleerd.
 
Toch besloten 'schoon schip' te maken.
Het schrijven van drie verschillende vormen van een titel heb ik nu vastgelegd in een functie,
waardoor de titel nu met deze eenvoudige expressie titel = "(.*)"; op te vragen is.
Een mooie gelegenheid om van een rommelige html structuur, hier en daar
nog met elkaar overlappende tags (nog een erfenis uit de netscape 4? periode), af te komen.
Veel knip, plak en wiswerk, maar daarbij kan weinig fout gaan.

Iedereen bedankt voor de hulp, want ook al is de vraag niet echt beantwoord,
toch heeft de 'discussie' in een goede oplossing geresulteerd!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan