2011-04-16 5 views
26

Digamos que tengo esto:PHP tira puntuacion

$hello = "Hello, is StackOverflow a helpful website!? Yes!"; 

y quiero pelar puntuacion lo que da salida como:

hello_is_stackoverflow_a_helpful_website_yes 

¿Cómo puedo hacer eso?

Respuesta

46
# to keep letters & numbers 
$s = preg_replace('/[^a-z0-9]+/i', '_', $s); # or... 
$s = preg_replace('/[^a-z\d]+/i', '_', $s); 

# to keep letters only 
$s = preg_replace('/[^a-z]+/i', '_', $s); 

# to keep letters, numbers & underscore 
$s = preg_replace('/[^\w]+/', '_', $s); 

# same as third example; suggested by @tchrist; ^\w = \W 
$s = preg_replace('/\W+/', '_', $s); 

de cadena

$s = "Hello, is StackOverflow a helpful website!? Yes!"; 

resultado (para todos los ejemplos) es

Hello_is_StackOverflow_a_helpful_website_Yes_

disfrutar!

+0

Hmmm ... pero si tengo 'Hola, mundo' 'Voy a hello__world' cuando no se supone que debe ser uno de subrayado no el espacio ... dos! . – nn2

+0

Lo tengo, nvm. ¡Gracias! – nn2

+1

¡Qué forma tan extraña de escribir '\ W'! – tchrist

14
function strip_punctuation($string) { 
    $string = strtolower($string); 
    $string = preg_replace("/[:punct:]+/", "", $string); 
    $string = str_replace(" +", "_", $string); 
    return $string; 
} 

En primer lugar la cadena se convierte a minúsculas, a continuación, se elimina puntuacion, a continuación, los espacios son reemplazados por guiones bajos (esto va a manejar uno o más espacios, por lo que si alguien pone dos espacios será reemplazado por un solo subrayado)

+0

¿No es '\ pP' la forma moderna de especificar la puntuación? – tchrist

+0

@tchrist la forma más compatible y legible (a través de expresiones regulares POSIX, GNU y PCRE) es usar clases de caracteres POSIX como '[: alnum:]' y '[: punct:]'. '\ pP'relies en cosas Unicode, identifique cómo funciona eso en PHP, teniendo en cuenta que PHP tiene un soporte Unicode horrible. –

+2

Si quiere * legible *, entonces usaría el nombre de propiedad completo: '\ p {General_Category = Punctuation}', que generalmente se abrevia como si fuera una propiedad binaria, como '\ p {Punctuation}'. Desafortunadamente PCRE no tiene un buen soporte de propiedad Unicode. La razón por la que nunca confío en las clases de créditos POSIX es porque están demasiado sujetas a la rotura según las configuraciones regionales y de usuario del proveedor. Casi nunca maneja Unicode correctamente, aunque esto es requerido por [UTS # 18's RL1.2] (http://unicode.org/reports/tr18/#Compatibility_Properties). Desconfío y me desagrada todo lo que no hace Unicode. – tchrist

3

me gustaría ir con algo como esto:

$str = preg_replace('/[^\w\s]/', '', $str); 

No sé si eso es más amplio de lo que está buscando, pero suena como lo que estamos tratando de hacer.

También noté que ha reemplazado espacios con guiones bajos en su muestra. El código que usaría para eso es:

$str = preg_replace('/\s+/', '_', $str); 

Tenga en cuenta que esto también colapsará múltiples espacios en un guión bajo.

10

Sin expresiones regulares:

<?php 
    $hello = "Hello, is StackOverflow a helpful website!? Yes!"; // original string 
    $unwantedChars = array(',', '!', '?'); // create array with unwanted chars 
    $hello = str_replace($unwantedChars, '', $hello); // remove them 
    $hello = strtolower($hello); // convert to lowercase 
    $hello = str_replace(' ', '_', $hello); // replace spaces with underline 
    echo $hello; // outputs: hello_is_stackoverflow_a_helpful_website_yes 
?> 
Cuestiones relacionadas