emuravjev/mdash

Приоритет операторов -- возможная ошибка

Opened this issue · 0 comments

https://github.com/emuravjev/mdash/blob/master/src-php/EMT.Lib.php#L200

$text = preg_replace_callback('/(\<\/?)([^<>]+?)(\>)/s', create_function('$m','return (strlen($m[1])==1 && substr(trim($m[2]), 0, 1) == \'-\' && substr(trim($m[2]), 1, 1) != \'-\')? $m[0] : $m[1].( substr(trim($m[2]), 0, 1) === "a" ? "%%___"  : ""  ) . EMT_Lib::encrypt_tag(trim($m[2]))  . $m[3];'), $text);

Без create_function() это раскрывается в:

$text = preg_replace_callback('/(\<\/?)([^<>]+?)(\>)/s', function ($m) {
                return
                    (strlen($m[1])==1 && substr(trim($m[2]), 0, 1) == '-' && substr(trim($m[2]), 1, 1) != '-') ? $m[0] : $m[1]
                    .
                    ( substr(trim($m[2]), 0, 1) === "a" ? "%%___"  : ""  )
                    .
                    EMT_Lib::encrypt_tag(trim($m[2]))
                    .
                    $m[3];
            }, $text);

что вообще выглядит как ошибка: приоритет тернарного оператора ?: ниже оператора . и этот код выполняется как:

(strlen($m[1])==1 && substr(trim($m[2]), 0, 1) == '-' && substr(trim($m[2]), 1, 1) != '-') 

? $m[0] 

: ( $m[1] . ( substr(trim($m[2]), 0, 1) === "a" ? "%%___"  : ""  )... ) ;

То есть либо $m[0] либо склеенная строка.

Все правильно?