2012-12-28 21 views
6

Stavo usando il limite della parola standard \b. Tuttavia, non si occupa del carattere punto (.) Nel modo in cui lo desidero.Alternativa al confine della parola Regex

Quindi la seguente espressione regolare:

\b(\w+)\b

corrisponderà cats e dogs in cats.dog se ho una stringa che dice cats and dogs don't make cats.dogs.

ho bisogno di una parola alternativa confine che abbinerà una parola intera solo se: (.) ​​

  1. esso non contiene il carattere punto
  2. è incapsulato da almeno uno spazio() personaggio ogni lato

Qualche idea ?!

P.S. Ho bisogno di questo per PHP

+0

Si desidera "ungreedy" –

risposta

5

Si potrebbe provare a utilizzare (?<=\s) prima e (?=\s) dopo al posto del \b per garantire che ci sia uno spazio prima e dopo di esso, tuttavia si potrebbe desiderare di consentire anche per la possibilità di essere al via o alla fine della stringa con (?<=\s|^) e (?=\s|$)

Questo escluderà automaticamente "parole" con un . in loro, ma sarebbe anche escludere una parola alla fine di una frase dal momento che non c'è spazio tra esso e l'arresto completo .

+0

Grazie. In ogni modo, potrei includere anche le parole all'inizio e alla fine di una frase ?! Potrei non averne bisogno, ma potrebbe essere solo bello sapere. –

2

Quello che stai cercando di abbinare può essere fatto facilmente con le funzioni di matrice e stringa.

$parts = explode(' ', $str); 
$res = array_filter($parts, function($e){ 
    return $e!=="" && strpos($e,".")===false; 
}); 

vi consiglio questo metodo come fa risparmiare tempo. Altrimenti sprecare poche ore per trovare una buona soluzione regex è abbastanza improduttivo.

+0

Ho bisogno di questo come parte di un altro regex come un primo passo di una funzione 'preg_replace' quindi non funzionerà abbastanza per quello che devo fare –

+0

Quindi è meglio chiedere ciò che è effettivamente necessario. Potrebbe esserci una soluzione migliore rispetto alla regex. –