Приоритет операторов -- возможная ошибка
Opened this issue · 0 comments
KarelWintersky commented
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]
либо склеенная строка.
Все правильно?