Ошибки регулярного выражения SimplePie - PullRequest
2 голосов
/ 22 марта 2012

1,3 dev версия SimplePie на xampp с PHP 5.3.

Я могу получить RSS-канал и отобразить его, но я получаю эти ошибки для каждого выбранного элемента:

Предупреждение: preg_match () [function.preg-match]: компиляцияне удалось: ничего не повторить по смещению 562 в C: \ xampp \ htdocs \ simplepie.php в строке 5877

Предупреждение: preg_match () [function.preg-match]: ошибка компиляции: ничего не повторять по смещению 509в C: \ xampp \ htdocs \ simplepie.php в строке 5965

Предупреждение: preg_match () [function.preg-match]: Ошибка компиляции: ничего не повторяется по смещению 509 в C: \ xampp \ htdocs \simplepie.php в строке 6031

Функции, в которых возникают ошибки:

    /**
 * Parse RFC2822's date format
 *
 * @access protected
 * @return int Timestamp
 */
public function date_rfc2822($date)
{
    static $pcre;
    if (!$pcre)
    {
        $wsp = '[\x09\x20]';
        $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
        $optional_fws = $fws . '?';
        $day_name = $this->day_pcre;
        $month = $this->month_pcre;
        $day = '([0-9]{1,2})';
        $hour = $minute = $second = '([0-9]{2})';
        $year = '([0-9]{2,4})';
        $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
        $character_zone = '([A-Z]{1,5})';
        $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
        $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';
    }
    if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))

/**
 * Parse RFC850's date format
 *
 * @access protected
 * @return int Timestamp
 */
public function date_rfc850($date)
{
    static $pcre;
    if (!$pcre)
    {
        $space = '[\x09\x20]+';
        $day_name = $this->day_pcre;
        $month = $this->month_pcre;
        $day = '([0-9]{1,2})';
        $year = $hour = $minute = $second = '([0-9]{2})';
        $zone = '([A-Z]{1,5})';
        $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i';
    }
    if (preg_match($pcre, $date, $match))

/**
 * Parse C99's asctime()'s date format
 *
 * @access protected
 * @return int Timestamp
 */
public function date_asctime($date)
{
    static $pcre;
    if (!$pcre)
    {
        $space = '[\x09\x20]+';
        $wday_name = $this->day_pcre;
        $mon_name = $this->month_pcre;
        $day = '([0-9]{1,2})';
        $hour = $sec = $min = '([0-9]{2})';
        $year = '([0-9]{4})';
        $terminator = '\x0A?\x00?';
        $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
    }
    if (preg_match($pcre, $date, $match))

Строки, на которые ссылаетсяошибка является последним выражением if для каждой функции ( вы можете увидеть полный код здесь ).

Я думаю, что в каждом $ pcre есть просто неправильное регулярное выражение для каждой функции.

Спасибо

1 Ответ

0 голосов
/ 23 марта 2012

Если с регулярным выражением что-то не так, оно не должно компилироваться.
Однако $this->day_pcre и $this->month_pcre могут содержать метасимволы, которые могут испортить регулярное выражение. Лучше проверь это.

Я заменил 'Mon' и 'Oct' и запустил его на Ideone. Кажется, работает.

Как примечание, вы можете обменять $ fws -

от $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)'
до $fws = '(?:(?:(?:\x0D\x0A)?' . $wsp . ')+)'

так как они эквивалентны и, вероятно, более эффективны.

В ваших функциях вы должны распечатать регулярные выражения для
$day/$month/$pcre переменные. Как еще можно ожидать отладки?

Это может быть что-то еще, я не знаю.

Вот что я получаю: http://ideone.com/zJ5vE

код

<?php

date_asctime( "Mon Oct 21 11:21:31 2012\x0A" );
date_asctime( "Mon Oct 22 12:22:32 2012\x0A" );
date_asctime( "Mon Oct 23 13:23:33 2012\x0A" );

print("==================\n");

date_rfc2822( 'Mon, 21 Oct 2012 21:01 -1011' );
date_rfc2822( 'Mon, 22 Oct 2012 22:02 -1012' );
date_rfc2822( 'Mon, 23 Oct 2012 23:03 -1013' );


/**
 * Parse C99's asctime()'s date format
 *
 * @access protected
 * @return int Timestamp
 */
function date_asctime($date)
{
    static $pcre;
    if (!$pcre)
    {
        $space = '[\x09\x20]+';

        $wday_name = 'Mon';  //$this->day_pcre;
        $mon_name = 'Oct';   //$this->month_pcre;

        $day = '([0-9]{1,2})';
        $hour = $sec = $min = '([0-9]{2})';
        $year = '([0-9]{4})';
        $terminator = '\x0A?\x00?';
        $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i';
    }
    if (preg_match($pcre, $date, $match))
    {
       print_r($match);
    }
}


/**
 * Parse RFC2822's date format
 *
 * @access protected
 * @return int Timestamp
 */
function date_rfc2822($date)
{
    static $pcre;
    if (!$pcre)
    {
        $wsp = '[\x09\x20]';

         // $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)';
        $fws = '(?:(?:(?:\x0D\x0A)?' . $wsp . ')+)';
        $optional_fws = $fws . '?';

        $day_name = 'Mon';  //$this->day_pcre;
        $month = 'Oct';     //$this->month_pcre;

        $day = '([0-9]{1,2})';
        $hour = $minute = $second = '([0-9]{2})';
        $year = '([0-9]{2,4})';
        $num_zone = '([+\-])([0-9]{2})([0-9]{2})';
        $character_zone = '([A-Z]{1,5})';
        $zone = '(?:' . $num_zone . '|' . $character_zone . ')';
        $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i';
    }
    // if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match))
    if (preg_match($pcre, $date, $match))
    {
       print_r($match);
    }
} 
?>

выход

Array
(
    [0] => Mon Oct 21 11:21:31 2012

    [1] => 21
    [2] => 11
    [3] => 21
    [4] => 31
    [5] => 2012
)
Array
(
    [0] => Mon Oct 22 12:22:32 2012

    [1] => 22
    [2] => 12
    [3] => 22
    [4] => 32
    [5] => 2012
)
Array
(
    [0] => Mon Oct 23 13:23:33 2012

    [1] => 23
    [2] => 13
    [3] => 23
    [4] => 33
    [5] => 2012
)
==================
Array
(
    [0] => Mon, 21 Oct 2012 21:01 -1011
    [1] => 21
    [2] => 2012
    [3] => 21
    [4] => 01
    [5] => 
    [6] => -
    [7] => 10
    [8] => 11
)
Array
(
    [0] => Mon, 22 Oct 2012 22:02 -1012
    [1] => 22
    [2] => 2012
    [3] => 22
    [4] => 02
    [5] => 
    [6] => -
    [7] => 10
    [8] => 12
)
Array
(
    [0] => Mon, 23 Oct 2012 23:03 -1013
    [1] => 23
    [2] => 2012
    [3] => 23
    [4] => 03
    [5] => 
    [6] => -
    [7] => 10
    [8] => 13
)
...