2014-04-09 7 views
0

Эта функция предназначена для дезинфекции заданного значения, но вместо этого выводит «n-a», как если бы не было указано значение. Это должен быть самый простой вопрос, но в этот момент он меня победил.Почему моя функция PHP не возвращает значение?

function slug($text){ 

    // replace non letter or digits by - 
    $text = preg_replace('~[^pLd]+~u', '-', $text); 

    // trim 
    $text = trim($text, '-'); 

    // transliterate 
    $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text); 

    // lowercase 
    $text = strtolower($text); 

    // remove unwanted characters 
    $text = preg_replace('~[^-w]+~', '', $text); 

    if (empty($text)) 
    { 
    return 'n-a'; 
    } 

    return $text; 
} 

Буду признателен за ввод.

+2

** Где ** это становится пустым? Вы пытались сбросить переменную, когда идете? (после замены после обрезки после strtolower после второй замены) – h2ooooooo

+0

'$ text = preg_replace ('~ [^ - w] + ~', '', $ text);' это удаляет все, кроме '-' и' w'. Я думаю, что в вашей строке нет '-' или' w'. поэтому вы получаете пустую строку. попробуйте переписать regex здесь – krishna

ответ

1
  1. Попробуйте использовать библиотеку mb_string вместо iconv. Его лучшая библиотека.
  2. В каждом экземпляре попробуйте var_dump или echo, чтобы убедиться в возврате данных.
2

Вы должны изменить свое первое регулярное выражение, которое, кажется, неправильно, должно быть,

// replace non letter or digits by - 
$text = preg_replace('~[^\w\d]+~u', '-', $text); 

Working Demo.

+1

Я думаю, что он имел в виду '\ pL \ d' (ака. unicode letter/digit). – h2ooooooo

+0

@ h2ooooooo - согласен. – Rikesh

+0

@ h2ooooooo - добавление обратной косой черты решает мою проблему, то есть первое регулярное выражение в \ pL \ d, а второе - \ w – TimD

Смежные вопросы