Overeenkomen met een spatie in regex

Ik moet overeenkomen met een spatie in een reguliere PHP-expressie. Iemand enig idee?

Ik bedoel zoals “gavin schulz”, de spatie tussen de twee woorden. Ik gebruik een reguliere expressie om ervoor te zorgen dat ik alleen letters, cijfers en een spatie toesta. Maar ik weet niet zeker hoe ik de ruimte moet vinden. Dit is wat ik nu heb:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);

Antwoord 1, autoriteit 100%

Als u een spatie zoekt, is dat " "(één spatie).

Als u op zoek bent naar een of meer, is het " *"(dat zijn tweespaties en een asterisk) of " +"(één spatie en een plus).

Als u op zoek bent naar algemene spaties, gebruikt u "[ X]"of "[ X][ X]*"of "[ X]+"waarbij xhet fysieke tabteken is (en elk wordt voorafgegaan door een enkele spatie in al die voorbeelden).

Deze werken in elke* regex-engine die ik ooit heb gezien (waarvan sommige niet eens het een of meer "+"-teken hebben, ugh).

Als je weet dat je een van de modernere regex-engines gaat gebruiken, zijn "\s"en zijn variaties de juiste keuze. Daarnaast geloof ik dat woordgrenzen ook overeenkomen met het begin en het einde van regels, wat belangrijk is als je zoekt naar woorden die mogen voorkomen zonder voorafgaande of volgende spaties.

Voor PHP specifiek, deze paginakan helpen.

Uit uw bewerking blijkt dat u alle ongeldige tekens wilt verwijderen. Het begin hiervan is (let op de spatie in de regex):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

Als je ook bedrog wilt om ervoor te zorgen dat er slechts één spatie tussen elk woord staat en geen spatie aan het begin of einde, is dat een beetje ingewikkelder (en waarschijnlijk een andere vraag), maar het basisidee zou zijn:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

Antwoord 2, autoriteit 14%

Spiekbriefje

Hier is een kleine spiekbrief met alles wat je moet weten over witruimte in reguliere expressies:

[[:blank:]]

Alleen spatie of tab, geen tekens voor nieuwe regels hetzelfde als bij het schrijven van [ \t].

[[:space:]]& \s

[[:space:]]en \shiervan zijn hetzelfde, ze komen beide overeen met spaties in spaties, nieuwe regels, tabs, enz…

\v

Komt overeen met verticale unicode-witruimte.

\h

Komt overeen met horizontale witruimte, inclusief Unicode-tekens, komen ook overeen met spaties, tabs, vaste/wiskundige/ideografische spaties.

x(eXtended-vlag)

Negeer alle witruimte, houd er rekening mee dat dit een vlag is, dus u voegt deze toe aan het einde van de regex zoals deze /hello/gmxdeze vlag negeert de witruimte in uw reguliere expressie.

p>

Als u bijvoorbeeld een uitdrukking als deze /hello world/xschrijft, komt deze overeen met helloworldmaar niet met hello worldmet de uitgebreide vlag staat ook opmerkingen in uw regex toe.

Voorbeeld

/helloworld #hello this is a comment/

Als je een spatie moet gebruiken, kun je \ gebruiken om spaties te matchen.


Antwoord 3, autoriteit 13%

Om exact overeen te komen met het spatieteken, kunt u de octale waarde \040gebruiken (Unicode-tekens weergegeven als octaal) of de hexadecimale waarde \x20(Unicode-tekens weergegeven als hex).

Hier is de regex-syntaxisreferentie: https://www.regular-expressions.info/ nonprint.html.


Antwoord 4

Ik gebruik een regex om ervoor te zorgen dat ik
alleen letters, cijfers en een spatie toestaan

Dan is het zo simpel als het toevoegen van een spatie aan wat je al hebt:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(let op, ik heb de s|verwijderd die onbedoeld leken? De swaren zeker overbodig; u kunt de |herstellen als u het)

Als je specifiek *a* spatie wilt, zoals in slechtseen enkele, dan heb je een complexere uitdrukking nodig dan deze, en zou je een apart, niet-regex stukje logica kunnen overwegen.


Antwoord 5

Het lijkt mij dat het gebruik van een REGEX in dit geval gewoon overkill zou zijn. Waarom niet gewoon strposom het spatieteken te vinden. Ook is er niets bijzonders aan het spatieteken in reguliere expressies, je zou er op dezelfde manier naar moeten kunnen zoeken als naar elk ander teken. Dat wil zeggen, tenzij u patroonwitruimte hebt uitgeschakeld, wat in dit geval nauwelijks nodig zou zijn.


Antwoord 6

In Perl is de schakelaar \s(witruimte).


Antwoord 7

Je kunt ook de \b gebruiken voor een woordgrens. Voor de naam zou ik zoiets als dit gebruiken:

[^\b]+\b[^\b]+(\b|$)

BEWERKENDit wijzigen in een regex in Perl-voorbeeld

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = $1;
 $last_name = $2;
}

OPNIEUW BEWERKENGebaseerd op wat je wilt:

$new_tag = preg_replace("/[\s\t]/","",$tag);

Antwoord 8

Gebruik het op deze manier om één ruimte toe te staan.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)

Antwoord 9

Ik probeer [[:space:]] uit in een geval waarin het lijkt alsof bloggers in WordPress niet-standaard spatietekens gebruiken. Het lijkt erop dat het zal werken.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

9 + 16 =

Other episodes