preg_replace pattern question

Kim Steinhaug

New Member
Noen som er gode på regex patterns, jeg prøver å komme opp med denne.
Eksempel tekster:
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit. In libero velit, quam venenatis vel turpisut ut, utrhoncus egestas sem ut. Etiam aliquet sapien eget est posuere commodo
  • Quam venenatis ullam pulvinar erat eu risus cursus blandit. Phasellus magna ut quam, dignissim vel consectetur eget, viverra in diam. Curabitur sem nulla, egestas nec interdum in, rutrum egestas nunc.
  • Donec lacinia mi nec feugiat viverra. Nullam eu vehicula justo. Quisque dapibus eleifend mauris ac tristique. Vivamus quam venenatis arcu et arcu commodo accumsan ut. In consectetur ante nec imperdiet dictum. Praesent eleifend elit a sapien lobortis, ac dictum sem bibendum. Nullam sit amet odio eget dui ultrices efficitur quam. Venenatis elit ut et ut.
Jeg ønsker å erstatte teksten mellom ordene "quam venenatis" og "ut". Jeg har merket i BOLD teksten som jeg prøver å få selectert for erstatting.
<?php
$string = preg_replace(/ (quam venenatis).*(ut) /,'REPLACE TEXT',$string);
?>
Problemet er bare at .* modifier er grådig og stopper ikke på første forekomst av (ut) men fortsetter ut linja?

Eks:
<?php

$string = 'one two three one two three one two three one two three';

echo preg_replace("/two(.*)one/",'##' ,$string) . '<br>';
// one ## two three
echo preg_replace("/(two).*(one)/",'##' ,$string) . '<br>';
// one ## two three
echo preg_replace("/two (.*?) one/",'##' ,$string) . '<br>';
// one ## ## ## two three

?>
I am looking for one of two possible results, either:

one two ## one two ## one two ## one two three

and single hit 1 time:

one two ## one two three one two three one two three

Anyone know how to do this?
 

adeneo

Medlem
Noe sånt kanskje

PHP:
$string = preg_replace_callback('/(quam venenatis\s)(.*?)(\sut)/is', function($matches){
    return $matches[1] . 'REPLACE TEXT' . $matches[3];
}, $string, 1);
 
Topp