Regex match elke witruimte

Ik wil een vervanging maken met behulp van Regex en Preg_Replace-functie. Dit is mijn code

$verif = "/wordA(\s*)wordB(?! wordc)/i";
$replacement = 'wordA wordb wordc';
$newvar = preg_replace($verif, $replacement, $article->text);

Dat werkt als we maar één witruimte hebben tussen Worda en WordB.
Ik moet overeenkomen met wat het aantal witruimtes tussen Worda & Amp; WordB.

Voorbeeld:

Worda (10 of meer witspace) WordB – & GT; Worda WordB Wordc Zelfde Worda (1 Whitespace) WordB – & GT; Worda WordB Wordc …


Antwoord 1, Autoriteit 100%

Uw regex zou moeten werken ‘as-is’. Ervan uitgaande dat het doet wat je wilt.

wordA(\s*)wordB(?! wordc)

Dit betekent overeenkomen met wordAgevolgd door 0 of meer spaties gevolgd door wordB, maar Niet overeenkomen indien gevolgd door wordc. Let op de eenpersoonsruimte tussen ?!en wordc, wat betekent dat wordA wordB wordcniet overeenkomt, maar wordA wordB wordcWill.

Hier zijn enkele voorbeeldwedstrijden en de bijbehorende vervangende uitvoer:

Merk op dat alle overeenkomsten worden vervangen, ongeacht hoeveel spaties. Er zijn een paar andere punten: –

  • (?! wordc)is een negatieve vooruitblik, dus u komt niet overeen met de regels wordA wordB wordcwaarvan wordt aangenomen dat ze bedoeld zijn (en daarom is de laatste regel komt niet overeen). Momenteel vertrouw je op de spatie na ?!om overeen te komen met de witruimte. Misschien wil je wat preciezer zijn en (?!\swordc)gebruiken. Als je wilt matchen met meer dan één spatie vóór wordc, kun je (?!\s*wordc)gebruiken voor 0 of meer spaties of (?!\s*+wordc)voor 1 of meer spaties afhankelijk van wat je bedoeling is.
    Als je regels wilt matchen met woordc na woordB, moet je natuurlijk geen negatieve vooruitblik gebruiken.

  • *komt overeen met 0 of meer spaties, dus het komt overeen met woordAwordB. U kunt +overwegen als u ten minste één spatie wilt.

  • (\s*)– de haakjes geven een vastleggende groep aan. Leg je met een reden de witruimte vast voor een groep? Als dat niet het geval is, kunt u gewoon de haakjes verwijderen, d.w.z. gebruik gewoon \s.

Update op basis van commentaar

Hallo het probleem is niet de uitdrukking, maar de HTML die wordt weergegeven   die niet als witruimte worden beschouwd. het is een Joomla-website.

Uw originele regex behouden die u kunt gebruiken:

wordA((?:\s| )*)wordB(?!(?:\s| )wordc)

Het enige verschil is dat de regex niet overeenkomt met de witruimte OF  . Ik heb wordcvervangen door \swordcomdat dat explicieter is. Merk op dat, zoals ik al heb aangegeven, de negatieve vooruitblik ?!nietzal overeenkomen wanneer woordB wordt gevolgd door een enkele spatie en woordc. Als je meerdere witruimten wilt matchen, zie dan mijn opmerkingen hierboven. Ik heb ook de capture-groep rond de witruimte behouden, als je dit niet wilt, verwijder dan de haakjes zoals hierboven al beschreven.

Voorbeelden van overeenkomsten:


Antwoord 2, autoriteit 3%

De reden dat ik een +heb gebruikt in plaats van een ‘*’ is omdat een plus is gedefinieerd als een of meer van de voorgaande elementen, waarbij een asterisk nul of meer is. In dit geval willen we een scheidingsteken dat iets concreter is, dus “een of meer” spaties.

word[Aa]\s+word[Bb]\s+word[Cc]

komt overeen met:

wordA wordB     wordC
worda wordb wordc
wordA   wordb   wordC

De woorden in deze uitdrukking moeten specifiek zijn, en ook in volgorde (a, b, dan c)

Other episodes