Synthax voor specifieke preg_replace

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Paul Weiss

Paul Weiss

04/01/2022 13:17:26
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>
 
PHP hulp

PHP hulp

26/01/2022 14:28:48
 
Willem vp

Willem vp

04/01/2022 15:43:32
Quote Anchor link
Even snel tussendoor, want ik heb eigenlijk geen tijd nu, maar dit zou moeten werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$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.
Gewijzigd op 04/01/2022 15:46:44 door Willem vp
 
Ivo P

Ivo P

04/01/2022 15:46:35
Quote Anchor link
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>


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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?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>
 
Paul Weiss

Paul Weiss

04/01/2022 15:57:16
Quote Anchor link
Bedankt voor je reactie. Dit zou er inderdaad. moeten komen te staan.

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

Ivo P

04/01/2022 16:00:06
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>
 
- Ariën -
Beheerder

- Ariën -

04/01/2022 16:00:07
Quote Anchor link
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.
Gewijzigd op 04/01/2022 16:00:45 door - Ariën -
 
Paul Weiss

Paul Weiss

04/01/2022 16:01:24
Quote Anchor link
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
 
Ivo P

Ivo P

04/01/2022 16:05:44
Quote Anchor link
in dat geval zou ik doen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$search
= '#(<h1[^>]+class="ko"[^>]*>).*?(</h1>)#';
?>


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

Paul Weiss

04/01/2022 16:09:30
Quote Anchor link
Super bedankt. werken allemaal. ik had er echt niet aan uit gekomen.
 
Ozzie PHP

Ozzie PHP

04/01/2022 16:43:20
Quote Anchor link
Ivo P op 04/01/2022 16:05:44:
in dat geval zou ik doen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?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?
 
Ivo P

Ivo P

04/01/2022 16:48:22
Quote Anchor link
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.

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.
 
Paul Weiss

Paul Weiss

04/01/2022 17:07:43
Quote Anchor link
Iedereen super bedankt voor al jullie reacties. Ik ben verder geholpen en kan nu lekker verder met mijn cms systeem.
 
Ozzie PHP

Ozzie PHP

04/01/2022 17:18:06
Quote Anchor link
Interessant Ivo! Dat maakt het een stuk duidelijker.

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)?
 
Ivo P

Ivo P

04/01/2022 18:56:05
Quote Anchor link
Dat is vooral omdat je anders die tags kwijt bent....

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.
 
Ozzie PHP

Ozzie PHP

04/01/2022 20:54:13
Quote Anchor link
>> dat script wat in de openingspost staat, vervangt alles door alleen die ene string.

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
 
Paul Weiss

Paul Weiss

04/01/2022 21:57:53
Quote Anchor link
Bij mijn script bij de openingspost worden de tags ook niet vervangen. die blijven gewoon staan. alleen de tekst ertussen wordt vervangen.
 
Ozzie PHP

Ozzie PHP

04/01/2022 22:37:13
Quote Anchor link
Dat is inderdaad wat ik zei. Vandaar dat ik benieuwd ben waarom Ivo voor deze aanpak kiest.
 
Paul Weiss

Paul Weiss

05/01/2022 08:26:43
Quote Anchor link
oh ja sorry. verkeerd gelezen inderdaad.
 
Ivo P

Ivo P

05/01/2022 12:21:12
Quote Anchor link
dit is mijn test-script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>


als ik dat uitvoer dan is mijn output:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
[centos@***~]$ php t2.php
Here my new text>[centos@***~]$
 
Paul Weiss

Paul Weiss

05/01/2022 12:53:23
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

05/01/2022 14:24:23
Quote Anchor link
@Ivo

Ik had gisteren even zo getest:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;

?>

Resultaat: https://3v4l.org/0JBZB

Hier blijven de h1 tags staan. Vandaar dat ik het me afvroeg.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.