Tengo el siguiente código php:

$name = 'Test. I Am-trd-yr-d-dq .mmmm';

if (strpos($name, '.') !== false) {
    preg_replace('/[^a-zA-Z0-9\s]/', ' ', substr($name, 0, 40)));
} else {
    preg_replace('/[^a-zA-Z0-9\s]/', '', substr($name, 0, 40)));
}

Lo que estoy tratando de hacer es que si la cadena contiene . punto, simplemente debería reemplazarla como '' más si contiene como - o / debería reemplazarla como ' ' spacw, pero actualmente solo está haciendo Test I Am trd yr d dq mmmm, que cambia el punto a '', así que obtuve 2 espacios.

El resultado esperado debería ser Test I Am trd yr d dq mmmm

php
0
momori14 18 oct. 2017 a las 13:36

3 respuestas

La mejor respuesta

Lea sobre preg_replace(). Luego lea sobre str_replace(). También puede hacer lo que necesita, se ejecuta más rápido y el código es mucho más limpio:

$name = 'Test. I Am-trd-yr-d-dq .mmmm';

$changed = str_replace(
    array('.', '-', '/'),     // replace each of these items...
    array('',  ' ', ' '),     // ... with the corresponding item from this list...
    $name                     // ... into this
);

var_dump($changed);
# string(26) "Test I Am trd yr d dq mmmm"
2
axiac 18 oct. 2017 a las 10:53

Si desea utilizar regex intente lo siguiente:

$name = 'Test. I Am-trd-yr-d-dq .mmmm';

$name = preg_replace_callback_array(
[
    '/[.]/' => function ($match) {
        return '';
    },
    '/[/-]/' => function ($match) {
        return ' ';
    }
],
$name);

Var_dump ($ nombre);

O simplemente puede usar strtr o str_replace:

$name = 'Test. I Am-trd-yr-d-dq .mmmm';

$name = strtr($name, ['.' => '', '/' => ' ', '-' => ' ']);

var_dump($name);
0
mega6382 18 oct. 2017 a las 11:38

Puede lograr lo deseado de esta manera:

$name = 'Test. I Am-trd-yr-d-dq .mmmm';
$name = preg_replace('/\./', '', $name);
$name = preg_replace('/[\-]/', ' ', $name);
0
V. Kovpak 18 oct. 2017 a las 11:00