Hallo,

Ik wil van iedere zin in een stuk tekst een (variabel) aantal " " vervangen door een "-".

Iedere zin begint en eindigt met een X. Daar tussen staat een aantal keer   achter elkaar (het aantal scheelt per regel). Al die   moeten vervangen worden door een streepje.

Het probleem is... hoe vervang ik elk van die   zonder dat ik de X aan het begin en eind vervang?

voorbeel tekst:

$text = 'X     X';
Hallo Ozzie

Is niet met preg_replace gedaan. Maar je zult het wel zien.
<?php

$string = 'X&nbsp;&nbsp;&nbsp;X';
echo strtr($string, array('&nbsp;' => '-'));

?>
Veel succes!
Dankjewel Aaron... ik had eerst str_replace gebruikt. Dat werkt ook wel... echter het probleem is dit. Als voorbeeld heb ik gezegd dat de zin eindigt met X, maar in de praktijk kan daar nog tekst achter komen waar nog meer "&nbsp;" in staan en die moeten niet vervangen worden. Uitsluitend de "&nbsp;" die tussen de 2 X'en staan... vandaar dat ik denk dat het met preg_replace moet...
Misschien is dit meer iets wat je zoekt?
<?php

# De string:
$string = 'X&nbsp;&nbsp;XPHPHulp&nbsp;X';

# Eerst de X en X eruit halen:
$between_x = preg_replace('#X(.*?)X(.*)#is', 'X$1X', $string);

# Alles weer in elkaar steken:
$string = strtr($between_x, array('&nbsp;' => '-')).substr($string, strlen($between_x));

echo $string;

?>
Ik denk meer zoiets:
<?php
$str = 'Hallo&nbsp;nog&nbsp;wat&nbsp;tekst&nbsp;';
$pattern = '/(\S)&nbsp;(\S)/';

preg_replace($pattern, '$1-$2', $str);
?>
Ik ga het voorbeeld even wat duidelijker proberen te maken. Iedere regel kan beginnen met een variabel aantal keer &nbsp; achter elkaar en daarachter kan nog andere tekst komen. Bijvoorbeeld:

een regel:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hierkomtnogwattekst

een andere regel:
&nbsp;&nbsp;hierkomtnogwattekst&nbsp;&nbsp;

nog een andere regel:
&nbsp;hierkomtnogwattekst&nbsp;&nbsp;

De dikgedrukte &nbsp; gedeelten moeten per &nbsp; vervangen worden door een "-"

Dit:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hierkomtnogwattekst

moet dus worden

------hierkomtnogwattekst

Iemand?
Ik zou, als echte REGEX liefhebber, dit gebruiken:
<?php
$str = '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hier komt nog wat tekst';
$pattern = '/&nbsp;(?!(\w|\s))/';

$newStr = preg_replace($pattern, '-', $str);

echo $newStr;
?>

Het eerste gedeelte van de pattern spreekt wel voor zich, maar het laatste niet. De (?!...) is een negative lookahead.
Stel je wilt een e die gevolgd wordt door 2 ll'en replacen naar een a. Dan kun je zoiets gebruiken: /ell/ Het nadeel is dat nu ll ook gereplaced wordt. Dat wil je niet, met lookahead en lookbehinds kun je dit voorkomen. In dit voorbeeld wordt de regex dan: /e(?=ll)/ Dit is qua matchen hetzelfde als hierboven, met als enige verschil dat je ll niet meeneemt om te replacen.
(?!) is een negatieve lookahead. Dit betekend dat hij alles wat ervoor staat matched als het niet wordt gevolgd door de tekens die erin staan. Als je bijv. alleen een 'e' wilt replacen die niet gevolgd wordt door 2 ll'en dan wordt je regex: /e(?!ll)/
<?php

$str = '&nbsp;&nbsp;&nbsp;0ier&nbsp;nog&nbsp;wat&nbsp;tekst.&nbsp;&nbsp;';
$chr = preg_replace('#(.*?)&nbsp;[A-za-z0-9](.*)#is', '$1&nbsp;', $str);

echo strtr($chr, array('&nbsp;' => '-')).substr($str, strlen($chr));

?>
Return: ---0ier&nbsp;nog&nbsp;wat&nbsp;tekst.&nbsp;&nbsp;

@Wouter
Kan het zijn dat bij jouw de laatste &nbsp; voor de tekst niet veranderd wordt?

Ook als ik het volgende als string gebruik:
&nbsp;&nbsp;&nbsp;0ier&nbsp;nog&nbsp;wat&nbsp;tekst.&nbsp;&nbsp;h
Geeft dit het volgende terug:
--&nbsp;0ier&nbsp;nog&nbsp;wat&nbsp;tekst.-&nbsp;h.
Wouter, hij lijkt het bijna goed te doen... alleen als ik dit heb:

&nbsp;&nbsp;SPATIE

(dus een spatie na de &nbsp;) dan lijkt ie het niet te doen. Heb je daar nog een oplossing voor?

[size=xsmall]Toevoeging op 08/03/2012 20:13:57:[/size]

Wouter, ik heb dit '/&nbsp;(?!(\w|\s))/' aangepast in '/&nbsp;(?!(\w))/'

Ik heb op de gok de spatie eruit gehaald. Ik ben niet heel goed met dat regex gedoe, maat het lijkt te werken!
Ja, dat klopt. Al zou je de () om \w weg kunnen halen.
Thanks Wouter!

Wat betekent dit stukje nou eigenlijk?

(?!\w)

Reageren