Goedenavond,

Ik wil uit een string een substring vissen en deze vervangen voor een deel van deze string.
Voorbeeld:
Het gaat om de substring 'xtxt'. Ik heb een string waarin 'xtxtxtxtxtxt' zit. Dan wil ik dat dit gereduceerd wordt tot eenmalig. 'xtxt'. Maar de string waar naar gekeken wordt kan ook 'xtxtxtxtxtxtxtxt' zijn.
Voorbeeld 2:
Het gaat om substring '\n\r'. Ik heb een string waarin '\n\r\n\r\n\r\n\r\n\r' zit. Dan wil ik dat dit gereduceerd wordt tot eenmalig '\n\r'.

Heb gedacht aan str_replace(), maar dan moet je vantevoren al aangeven wat de 'search' is, en het is nog onduidelijk hoe vaak deze voorkomt.

Iemand enig idee?
Je zou dan met Regulair Expressions moeten werken (uitleg daarover hier: http://www.phphulp.nl/php/tutorial/php-functies/regular-expressions/520/ )

In jou geval wordt het:
<?php
$haystack = 'lorem ipsum xtxtxtxtxtxt dolor mir...';
$needle = 'xtxt';

$str = preg_replace('/('.$needle.')*/', '$1', $haystack);

echo $str; // 'lorem ipsum xtxt dolor mir...'
?>

Als je meerdere needles wilt moet je ze scheiden met een |
<?php
// ...
$needle = 'xtxt|fo'; // zal dingen als 'xtxtxtxtxt' en 'fofofofo' vervangen door 'xtxt' en 'fo'
// ...
?>
Bedankt, Wouter.
Met een gewone needle lukt het prima, maar als ik bijvoorbeeld '\n\r' als needle wil, verandert de string niets.
Heb je een oplossing? :)
de slash escapen met een slash...dus \\n\\r...en dan moet je die slash volgens mij ook weer escapen omdat het een escape slash is...dus \\\n\\\r
Bedankt, Henze.
Het werkt. ;)
Trouwens, je probeerde eerst met str_replace.
Met een eenvoudige lus lukt het daarmee ook.
(Probeer met PHP_EOL in plaats van "\r\n")


<?php
$mijntekst = "Lorem ipsum\r\n\r\n\r\n\r\n\r\nen nog van alles\r\n\r\n\r\nen nog een lijntje";
$aangepast = reduce_newlines($mijntekst) ;
// testen 
echo '<b>origineel:</b> <pre>' . $mijntekst . '</pre>';
echo '<b>aangepast:</b> <pre>' . $aangepast . '</pre>';

function reduce_newlines($string) {
  $count = 1;
  while($count) {
    $string = str_replace(PHP_EOL . PHP_EOL, PHP_EOL, $string, $count);
  }
  return $string;
}
?>
Met de code van Wouter en de aanvulling van Henze leek het te werken. Alleen in mijn code wil het niet werken. Iemand enig idee?
while($row = mysqli_fetch_assoc($result)){
    echo json_encode($row['post_content']).'<br/><br/>';
    $needle = '\\\r\\\n';
	$row['post_content'] = preg_replace('/('.$needle.')*/', '$1', $row['post_content']);
	echo json_encode($row['post_content']);			
}

De string moet naar json geconverteerd worden, zodat een iOS-app hem uit kan lezen. ;)

De code van Kris werkte helaas helemaal niet.

Edit: Om een of andere reden werkt de code nu wel. Bedankt allen!
Het probleem is dat je die json_encode in een lus zet. Het resultaat zal niet een string leveren die json kan lezen. Gebruik json_encode slechts 1 keer, op het einde.

<?php
$resultArray = array();
while($row = mysqli_fetch_assoc($result)) {
$row['post_content'] = preg_replace('/('.$needle.')*/', '$1', $row['post_content']);
$resultArray[] = $row['post_content'];
}
echo json_encode($resultArray);
?>
Kris, dat had ik al, maar dit was om te kijken wat er fout ging. ;)

Reageren