Synthax voor specifieke preg_replace
<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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?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);
?>
$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);
?>
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.
Gewijzigd op 04/01/2022 15:46:44 door Willem vp
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>
Toevoeging op 04/01/2022 15:56:27:
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:
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>
<html>
<h1 class="foo">Here my new text</h1>
</html>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?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;
?>
$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;
?>
Klik hier.
Een handige site voor als je wilt weten wat een reguliere expressie doet.
Gewijzigd op 04/01/2022 16:00:45 door - Ariën -
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
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:
Misschien leuk om ook nog even een uitleg/ontleding erbij te zetten?
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.
Toevoeging op 04/01/2022 16:49:29:
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.
Iedereen super bedankt voor al jullie reacties. Ik ben verder geholpen en kan nu lekker verder met mijn cms systeem.
Jij gebruikt $1 en $2. Als ik het goed begrijp, worden de eerste en laatste groep in de beginpost juist niet gecaptured/vervangen? Is er een speciale reden waarom jij dat wel doet (via $1 en $2)?
Vandaar mijn vraag ook helemaal bovenaan: dat script wat in de openingspost staat, vervangt alles door alleen die ene string. En aan het vangen van de tekst die tussen de H1-tags staat, heb je weinig: die tekst vervang je immers dus was het niet interessant om te weten wát er stond.
In principe zou je de sluitende /h1 hardcoded in de $replace kunnen zetten, maar op deze manier kun je $replace ook gebruiken als je hetzelfde met een h2 tag wilt uithalen.
Ah oké, ik dacht eigenlijk dat het script in de openingspost alleen de tekst tussen de <h1> en </h1> verving en dat de tags zelf gewoon bleven staan.
Gewijzigd op 04/01/2022 20:54:25 door Ozzie PHP
Bij mijn script bij de openingspost worden de tags ook niet vervangen. die blijven gewoon staan. alleen de tekst ertussen wordt vervangen.
Dat is inderdaad wat ik zei. Vandaar dat ik benieuwd ben waarom Ivo voor deze aanpak kiest.
oh ja sorry. verkeerd gelezen inderdaad.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$string = ' <html> test <h1 class="ko">bar</h1> barfor <h1>hallo</h1> foobar </html>';
$search = "/[^<h1>](.*)[^<\/h1>]/";
$replace = "Here my new text";
$content = preg_replace($search,$replace,$string);
echo $content;
?>
$string = ' <html> test <h1 class="ko">bar</h1> barfor <h1>hallo</h1> foobar </html>';
$search = "/[^<h1>](.*)[^<\/h1>]/";
$replace = "Here my new text";
$content = preg_replace($search,$replace,$string);
echo $content;
?>
als ik dat uitvoer dan is mijn output:
ja kloppt inderdaad. die werkt ook niet. had per abuis een verkeerde genomen. maar dankzij alle hulp hbe ik nu werkende scripts, waarmee ik op diverse manieren tekst kan aanpassen. Ik heb nu ook een form aangemaakt waarmee ik de ingevoerde tekst doorstuur naar een php die dan de oude tekst kan vervangen.
Ik had gisteren even zo getest:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$string = '<h1>Oude tekst hier</h1>';
$search = "/[^<h1>](.*)[^<\/h1>]/";
$replace = "Here my new text";
$content = preg_replace($search,$replace,$string);
echo $content;
?>
$string = '<h1>Oude tekst hier</h1>';
$search = "/[^<h1>](.*)[^<\/h1>]/";
$replace = "Here my new text";
$content = preg_replace($search,$replace,$string);
echo $content;
?>
Resultaat: https://3v4l.org/0JBZB
Hier blijven de h1 tags staan. Vandaar dat ik het me afvroeg.