将多个正则表达式合并为一个

时间:2011-11-11 19:35:27

标签: php regex unicode sanitization

我正在过滤所有用户输入以删除以下字符: 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 个答案:

答案 0 :(得分:2)

您可以将一个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);