Vraag PHP Reguliere expressie - Verwijder alle niet-alfanumerieke tekens


Ik gebruik PHP.

Mijn string kan er zo uitzien

This is a string-test width åäö and some über+strange characters: _like this?

Vraag

Is er een manier om niet-alfanumerieke tekens te verwijderen en deze te vervangen door een spatie? Hier zijn enkele niet-alfanumerieke tekens:

  • -
  • +
  • :
  • _
  • ?

Ik heb er veel discussies over gelezen, maar ze ondersteunen geen andere talen, zoals deze:

preg_replace("/[^A-Za-z0-9 ]/", '', $string);

Vereisten

  • Mijn lijst met geen lettertekens is misschien niet compleet.
  • Mijn inhoud bevat tekens in verschillende talen, zoals åäöü. Kan heel veel meer zijn.
  • De niet-alfanumerieke tekens moeten worden vervangen door een spatie. Anders zou het woord aan elkaar gelijmd zijn.

12
2018-05-07 19:26


oorsprong


antwoorden:


Je kunt dit proberen:

preg_replace('~[^\p{L}\p{N}]++~u', ' ', $string);

\p{L} staat voor alle alfabetische tekens (ongeacht het alfabet).

\p{N} staat voor cijfers.

Met de u modifier-tekens van de onderwerpstring worden behandeld als unicode-tekens.

Of dit:

preg_replace('~\P{Xan}++~u', ' ', $string);

\p{Xan} bevat unicode letters en cijfers.

\P{Xan} bevat alles dat geen unicode letters en cijfers is. (Let op, het bevat ook witte spaties waar je mee kunt bewaren ~[^\p{Xan}\s]++~u )

Als u een meer specifieke set toegestane letters wilt, moet u deze vervangen \p{L} met bereiken in unicodetabel.

Voorbeeld:

preg_replace('~[^a-zÀ-ÖØ-öÿŸ\d]++~ui', ' ', $string);

Waarom hier een bezittelijke kwantor (++) gebruiken?

~\P{Xan}+~u geeft je hetzelfde resultaat als ~\P{Xan}++~u. Het verschil hier is dat de engine in de eerste elke backtrack-positie registreert (die we niet nodig hebben), terwijl hij in de tweede kolom niet werkt (zoals in een atomische groep). Het resultaat is een kleine prestatiewinst.

Ik denk dat het een goede gewoonte is om bezittelijke kwantoren en atoomgroepen te gebruiken wanneer het mogelijk is.

Echter, de PCRE regex-engine maakt automatisch een kwantor bezittelijk in voor de hand liggende situaties (bijvoorbeeld: a+b => a++b) behalve Als de PCRE-module is gecompileerd met de optie PCRE_NO_AUTO_POSSESS. (http://www.pcre.org/pcre.txt)

Meer informatie over bezittelijke kwantoren en atoomgroepen hier (bezittelijke kwantoren) en hier (atoomgroepen) of hier


28
2018-05-07 19:33



Ben je misschien op zoek naar \W?

Zoiets als:

/[\W_]*/

Komt overeen met alle niet-alfanumerieke tekens en onderstrepingstekens.

\w komt overeen met alle woordtekens (alfabet, numeriek, onderstrepingstekens)

\W komt overeen met alles wat niet in \w.

Zo, \W komt overeen met niet-alfanumerieke tekens en u voegt sindsdien het onderstrepingsteken toe \W komt niet overeen met onderstrepingstekens.

EDIT: hierdoor wordt uw coderegel:

preg_replace("/[\W_]*/", ' ', $string);

De ' ' betekent dat alle overeenkomende tekens (niet de letters en niet de cijfers) witte spaties worden.

REEDIT: misschien wilt u er nog een gebruiken preg_replace om alle opeenvolgende spaties te verwijderen en ze te vervangen door een enkele spatie, anders krijg je het volgende:

This is a string test width     and some  ber strange characters   like this 

Je kunt gebruiken:

preg_replace("/\s+/", ' ', $string);

En knip als laatste de begin- en eindspaties.


3
2018-05-07 19:31



Ik ben niet helemaal zeker welke variëteit van regex je gebruikt. Met POSIX-regexes kunt u echter een alfabetische klasse uitdrukken, waarbij [: alpha:] elk alfabetisch teken vertegenwoordigt.

Dus probeer:

preg_replace("/[^[:alpha:]0-9 ]/", '', $string);

Eigenlijk ben ik [: alnum:] vergeten - dat maakt het eenvoudiger:

preg_replace("/[^[:alnum:] ]/", '', $string);

1
2018-05-07 19:30



\p{xx} is wat je zoekt, geloof ik, kijk hier

Dus probeer:

preg_replace("/\P{L}+/u", ' ', $string);

1
2018-05-07 19:33