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';
?
Onbekende gebruiker
08-03-2012 00:33
Hallo Ozzie
Is niet met preg_replace gedaan. Maar je zult het wel zien.
<?php
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 " " in staan en die moeten niet vervangen worden. Uitsluitend de " " die tussen de 2 X'en staan... vandaar dat ik denk dat het met preg_replace moet...
?
Onbekende gebruiker
08-03-2012 00:55
gewijzigd op 08-03-2012 00:58
Misschien is dit meer iets wat je zoekt?
<?php
# De string:
$string = 'X XPHPHulp 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(' ' => '-')).substr($string, strlen($between_x));
Ik ga het voorbeeld even wat duidelijker proberen te maken. Iedere regel kan beginnen met een variabel aantal keer achter elkaar en daarachter kan nog andere tekst komen. Bijvoorbeeld:
een regel: hierkomtnogwattekst
een andere regel: hierkomtnogwattekst
nog een andere regel: hierkomtnogwattekst
De dikgedrukte gedeelten moeten per vervangen worden door een "-"
Ik zou, als echte REGEX liefhebber, dit gebruiken:
<?php
$str = ' hier komt nog wat tekst';
$pattern = '/ (?!(\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)/
@Wouter
Kan het zijn dat bij jouw de laatste voor de tekst niet veranderd wordt?
Ook als ik het volgende als string gebruik:
0ier nog wat tekst. h
Geeft dit het volgende terug:
-- 0ier nog wat tekst.- h.