Объединение нескольких регулярных выражений в одно - PullRequest
3 голосов
/ 11 ноября 2011

Я фильтрую весь пользовательский ввод, чтобы удалить следующие символы: http://www.w3.org/TR/unicode-xml/#Charlist («не подходит для использования с разметкой»). Итак, у меня есть две функции:


if (!function_exists("mb_trim")) {
    function mb_trim($str)
    {
        return preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', $str);
    }
}

function sanitize($str)
{
    // Clones of grave and accent
    $str = preg_replace("/[\x{0340}-\x{0341}]+/u", "", $str);

    // Obsolete characters for Khmer
    $str = preg_replace("/[\x{17A3}]+/u", "", $str);

    $str = preg_replace("/[\x{17D3}]+/u", "", $str);

    // Line and paragraph separator
    $str = preg_replace("/[\x{2028}]+/u", "", $str);

    $str = preg_replace("/[\x{2029}]+/u", "", $str);

    // BIDI embedding controls (LRE, RLE, LRO, RLO, PDF)
    $str = preg_replace("/[\x{202A}-\x{202E}]+/u", "", $str);

    // Activate/Inhibit Symmetric swapping
    $str = preg_replace("/[\x{206A}-\x{206B}]+/u", "", $str);

    // Activate/Inhibit Arabic from shaping
    $str = preg_replace("/[\x{206C}-\x{206D}]+/u", "", $str);

    // Activate/Inhibit National digit shapes
    $str = preg_replace("/[\x{206E}-\x{206F}]+/u", "", $str);

    // Interlinear annotation characters
    $str = preg_replace("/[\x{FFF9}-\x{FFFB}]+/u", "", $str);

    // Byte Order Mark
    $str = preg_replace("/[\x{FEFF}]+/u", "", $str);

    // Object replacement character
    $str = preg_replace("/[\x{FFFC}]+/u", "", $str);

    // Scoping for Musical Notation
    $str = preg_replace("/[\x{1D173}-\x{1D17A}]+/u", "", $str);

    $str = mb_trim($str);

    if (mb_check_encoding($str)) {
        return $str;
    } else {
        return false;
    }
}

У меня не так много знаний о регулярных выражениях, поэтому я хочу знать

  • Корректна ли функция mb_trim для обрезки многобайтовых строк?
  • Возможно ли объединить все регулярные выражения в функции продезинфицировать сделать только одно preg_replace?

Спасибо

1 Ответ

2 голосов
/ 11 ноября 2011

Вы можете сделать с одним preg_replace, объединяя их в один набор символов следующим образом:

 $str = preg_replace("/[\x{0340}-\x{0341}\x{17A3}\x{17D3}\x{2028}-\x{2029}\x{202A}-\x{202E}\x{206A}-\x{206B}\x{206C}-\x{206D}\x{206E}-\x{206F}\x{FFF9}-\x{FFFB}\x{FEFF}\x{FFFC}\x{1D173}-\x{1D17A}]+/u", "", $str);
...