Hallo. Ik ben redelijk nieuw in php. Ik heb onderstaande php script wat goed werkt. De oude tekst die zich bevindt in test.html wordt perfect vervangen voor de nieuwe middels de preg_replace functie. echter nu loop ik tegen een ander probleem aan. Ik heb namelijk een class toegevoegd in de html code dus als volgt:

<h1 class="check1>Oude tekst hier</h1>

Weet iemand wat nu de juiste synthax is in $search om de tekst toch te vervangen via de preg_replace functie?

Hieronder dan de php:

<?php

$myfile = "test.html"; // or .php
$string = file_get_contents($myfile);

$search = "/[^<h1>](.*)[^<\/h1>]/";
$replace = "Here my new text";



$content = preg_replace($search,$replace,$string);
file_put_contents($myfile, $content);
?>
Even snel tussendoor, want ik heb eigenlijk geen tijd nu, maar dit zou moeten werken:

$search = '/<h1(?:\s+class="[^"]*")? >(.*)<\/h1>/';


De spatie tussen de ? en de > moet je wel even weghalen, want als ik die er niet tussen zet, kan de website er niet mee overweg...

De oorspronkelijke regex is trouwens verre van optimaal, want hij matcht ook als je een tag als <<1hh>11hh>> gebruikt, omdat hij alleen kijkt naar een willekeurige combinatie van <, >, 1 en h.

Als je wilt weten hoe de regex precies werkt en wat er mis is met de oude, wil ik dat in een volgend bericht wel uitleggen.
Je wilt dus de tekst tussen de <h1>tags vervangen?

Ik begrijp de inzet van de blokhaken hier niet helemaal. Zeker niet in combinatie met de ^

Stel er staat in je bron:

<html>
<h1 class="foo">hiet staat iets</h1>
</html>

Wat moet er dan uiteindelijk staan?

<html>
<h1 class="foo">Here my new text</h1>
</html>

of

<html>
Here my new text
</html>


[size=xsmall]Toevoeging op 04/01/2022 15:56:27:[/size]

ik zou de regex laten zoeken naar

"begint met '<h1' en dan tot de eerst volgende '>'"
Daarmee voorkom je het zelfde probleem als je ook nog een id, style of andere property toevoegt:

<?php
$search = '#<h1[^>]*>(.*?)</h1>#';
?>

Dit zoekt dus naar een tag die begint met "<h1" en dan volgen er 0 of meer (*) tekens die niet zijn een >:
[^>]
Dan ungreedy de tekst op te pakken: (.*?)
en tenslotte de sluitende </h1>



Bedankt voor je reactie. Dit zou er inderdaad. moeten komen te staan.

<html>
<h1 class="foo">Here my new text</h1>
</html>
<?php

$string = ' <html> test <h1 class="ko">bar</h1> barfor <h1>hallo</h1> foobar </html>';

$search = '#(<h1[^>]*>).*?(</h1>)#';
$replace = '$1Here my new text$2';



$content = preg_replace($search,$replace,$string);

echo $content;
?>
Met Willem's reg-exp als basis heb ik een voorbeeld via de website RegExper.com laten maken.

Klik hier.

Een handige site voor als je wilt weten wat een reguliere expressie doet.
Belangrijk dat er gezocht moet worden naar de h1 tag waarin de desbetreffende class staat, op dit manier kan ik namelijk text vervangen op unieke locaties
in dat geval zou ik doen
<?php
$search = '#(<h1[^>]+class="ko"[^>]*>).*?(</h1>)#';
?>

Wederom met de mogelijkheid dat ook
<h1 style="color:#000" class="ko" id="A"> voldoet.
Super bedankt. werken allemaal. ik had er echt niet aan uit gekomen.
Ivo P op 04/01/2022 16:05:44

in dat geval zou ik doen
<?php
$search = '#(<h1[^>]+class="ko"[^>]*>).*?(</h1>)#';
?>

Wederom met de mogelijkheid dat ook
<h1 style="color:#000" class="ko" id="A"> voldoet.

Misschien leuk om ook nog even een uitleg/ontleding erbij te zetten?

ok, de uitleg:

zoek naar "<h1"
Daarna komen andere tekens , maar niet de afsluitende ">": [^>]+
De + vereist dat dat minimaal 1 teken is, dus een spatie valt daar ook onder.
Net als bijvoorbeeld een complete style-property.

Na deze reeks tekens (of alleen een spatie) volgt hardcoded 'class="ko"'

Daar achter kan ook nog iets komen (niet zijnde de afsluitende ">"): [^>]*

Deze * zegt dat we uit die reeks 0 of meer tekens mogen verwachten. "lege string voldoet dus, maar ook een reeks van 100 tekens.

En tenslotte de afsluitende ">"

De rest heb ik boven al uitgelegd.

[size=xsmall]Toevoeging op 04/01/2022 16:49:29:[/size]

oh: en omdat de ( ) om de <h1> en </h1> staan, zitten die in $1 en $2 zodat we die in de replace kunnen gebruiken om 1 op 1 neer te zetten, en niet daar hard <h1> neer te zetten.

Reageren