Preg_replace pattern moet alleen een heel woord vervangen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark Kwebeman

Mark Kwebeman

25/02/2018 11:21:02
Quote Anchor link
Ik heb een preg_replace pattern dat alleen de woorden vervangt in een tekst die tussen <p> en </p> staat. Dat werkt goed. Alleen iets te goed. Het probleem wat ik nu heb is dat ik alleen een geheel woord wil vervangen als die voorkomt en niet een deel van een woord.

Voorbeeld: het woord "strand" wordt vervangen in de tekst voor een link. Maar ook een deel van het woord "zandstrand" wordt vervangen en komt er uit te zien als: zand<a href="#">strand</a>. Het woord "zandstrand" zou in dit geval genegeerd moeten worden.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
foreach ($keywords as $word => $link) {
  $pattern = '|^(<p[^>]*>.*)('. preg_quote($word, '|') .')(.*</p>)$|mui';
  $replace = '$1<a href="'. site_url() .'/tag/'. $link .'/">$2</a>$3';
  $content = preg_replace($pattern, $replace, $content);
}

?>


Heeft er iemand de oplossing?

Edit:
Ik heb code-tags geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 25/02/2018 11:36:24 door - Ariën -
 
PHP hulp

PHP hulp

26/11/2024 14:22:15
 
- Ariën  -
Beheerder

- Ariën -

25/02/2018 11:35:37
Quote Anchor link
Volgens mij moet je een /b aan het einde van je reg-ex plaatsen. Dit is een boundary die ervoor zorgt dat er exact gematched wordt met het hele woord.
 
Mark Kwebeman

Mark Kwebeman

25/02/2018 11:38:11
Quote Anchor link
Dat idee had ik ook al, maar waar ik dit ook plaats. Het probleem blijft of wordt zelfs erger. Als ik hier $pattern = '|^(<p[^>]*>.*)('. preg_quote($word, '|') .')(.*</p>)$|mui/b'; van maak, dan verdwijnt de hele content. Of doe ik dit nu verkeerd?
 
- Ariën  -
Beheerder

- Ariën -

25/02/2018 11:39:28
Quote Anchor link
Hoe ziet je pattern er nu uit volgens $pattern?
 
Mark Kwebeman

Mark Kwebeman

25/02/2018 11:41:01
Quote Anchor link
Dit is de volledige code

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
foreach ($keywords as $word => $link) {
  $pattern = '|^(<p[^>]*>.*)('. preg_quote($word, '|') .')(.*</p>)$|mui';
  $replace = '$1<a href="'. site_url() .'/tag/'. $link .'/">$2</a>$3';
  $content = preg_replace($pattern, $replace, $content);
}

?>


Bij deze code verdwijnt de hele $content

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
foreach ($keywords as $word => $link) {
  $pattern = '|^(<p[^>]*>.*)('. preg_quote($word, '|') .')(.*</p>)$|mui/b';
  $replace = '$1<a href="'. site_url() .'/tag/'. $link .'/">$2</a>$3';
  $content = preg_replace($pattern, $replace, $content);
}

?>
Gewijzigd op 25/02/2018 11:42:00 door Mark Kwebeman
 
- Ariën  -
Beheerder

- Ariën -

25/02/2018 11:43:59
Quote Anchor link
Het is even geleden dat ik daarmee gespeeld heb, maar volgens mij moest je de string tussen \b en \b zetten.

Laat anders even een voorbeeld van je (geparste) pattern zien. Dan kan je meteen via https://regexper.com/ deze uittesten.
 
Mark Kwebeman

Mark Kwebeman

25/02/2018 11:59:52
Quote Anchor link
Ik heb het probleem op kunnen lossen mede dankzij je tip. Ik heb het pattern wat aangepast en dit was de oplossing:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$pattern = '/^(<p[^>]*>.*)\b('. preg_quote($word, '|') .')\b(.*<\/p>)$/imu';
 
Rob Doemaarwat

Rob Doemaarwat

25/02/2018 14:15:52
Quote Anchor link
Let op dat je in je $pattern nu de "/" als delimiter gebruikt, maar in preg_quote() nog steeds de "|" meegeeft.
(persoonlijk geef ik de voorkeur aan "/", omdat je je regex-en dan redelijk naadloos naar javascript-land kunt meenemen).
 
Mark Kwebeman

Mark Kwebeman

25/02/2018 14:20:59
Quote Anchor link
Bedankt voor de oplettendheid. Voor wie het resultaat wil zien: https://www.vakantieviking.nl/vakanties/atlantis-the-palm-in-dubai-verenigde-arabische-emiraten-952-euro/

Het script vervangt binnen de content alleen de aangegeven woorden in paragrafen, zodat de alt of title in afbeeldingen en video's ook niet meegenomen worden.
 
Thomas van den Heuvel

Thomas van den Heuvel

25/02/2018 20:37:30
Quote Anchor link
Rob Doemaarwat op 25/02/2018 14:15:52:
(persoonlijk geef ik de voorkeur aan "/", omdat je je regex-en dan redelijk naadloos naar javascript-land kunt meenemen).


En het #-teken? Wellicht is dat nog beter als delimiter?
In PHP is het #-teken misschien handiger? Regexen portable houden, weet niet of dat echt zinnig is?
Gewijzigd op 25/02/2018 20:40:21 door Thomas van den Heuvel
 
Rob Doemaarwat

Rob Doemaarwat

25/02/2018 22:12:08
Quote Anchor link
@Thomas: Meestal voor (ook) client-side validatie (als extra stukje service naar de gebruiker toe).
 



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.