Preg_replace pattern moet alleen een heel woord vervangen
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)
1
2
3
4
5
6
7
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);
}
?>
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.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 25/02/2018 11:36:24 door - Ariën -
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.
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?
Hoe ziet je pattern er nu uit volgens $pattern?
Code (php)
1
2
3
4
5
6
7
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);
}
?>
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)
1
2
3
4
5
6
7
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);
}
?>
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
Laat anders even een voorbeeld van je (geparste) pattern zien. Dan kan je meteen via https://regexper.com/ deze uittesten.
(persoonlijk geef ik de voorkeur aan "/", omdat je je regex-en dan redelijk naadloos naar javascript-land kunt meenemen).
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.
Bedankt voor de oplettendheid. Voor wie het resultaat wil zien: 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.
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).
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
@Thomas: Meestal voor (ook) client-side validatie (als extra stukje service naar de gebruiker toe).