Heizer: wie eine backreference modifizieren?

Beitrag lesen

LIeber Felix

Mit PREG_OFFSET_CAPTURE bekommst du ein Array dieser Art:

Array(
  [0] => Array(
     [0] => scherz-a
     [1] => 0
  )
  [1] => Array(
     [0] => a
     [1] => 7
  )
)

Die erste Dimension sind die Subpattern, in der zweiten liegt auf Schlüssel 0 das Match und auf Schlüssel 1 die Position im Input-String (also z.B. 7 für das a). Diese Angaben kannst du in substr_replace() verwenden, um genau diesen gefundenen Teil durch etwas beliebiges anderes zu ersetzen.

in deinem Beispiel würde das dann so aussehen:

preg_match_all("/scherz-([abc])/",$usereingabe,$matches,PREG_OFFSET_CAPTURE);
list($orig,$sub1) = offsetArray($matches); // offsetArray() ist von mir, siehe untern.
foreach ($orig as $key => $elem) {
  $usereingabe = substr_replace($usereingabe,$array[$sub1[$key][0]],$orig[$key][1],strlen($orig[$key][0]));
}

Das ist jetzt ungetestet.

Für mich hat es den vorteil, daß ich sehr flexiebel bin, und die Funktion ist wesentlich übersichtlicher.

// offsetArray() macht ein array_reverse() für jedes Subpattern.
function offsetArray($matches) {
 $ret = array();
 while (count($matches) > 0) {
  $ret[] = array_reverse(array_shift($matches));
 }
 return $ret;
}

Grüße

Heizer