php সকল একটি স্ট্রিং serialized হয় কিনা দেখতে চেক করুন?




ট্যাগ কাকে বলে (9)

আমি যে ভাবে এটা পছন্দ করে:

 if (is_array(unserialize($serialized_string))):

Serialize () ফাংশনের ফলাফল / আউটপুট কোন স্ট্রিং কিনা তা নির্ধারণ করার সেরা উপায় কী?


পাসকাল মার্টিনের চমৎকার উত্তর সত্ত্বেও, আমি যদি অন্য কোন উপায়ে যোগাযোগ করতে পারতাম তবে আমি অদ্ভুত ছিলাম, তাই আমি মানসিক ব্যায়ামের মতোই এটি করেছি।

<?php

ini_set( 'display_errors', 1 );
ini_set( 'track_errors', 1 );
error_reporting( E_ALL );

$valueToUnserialize = serialize( false );
//$valueToUnserialize = "a"; # uncomment this for another test

$unserialized = @unserialize( $valueToUnserialize );

if ( FALSE === $unserialized && isset( $php_errormsg ) && strpos( $php_errormsg, 'unserialize' ) !== FALSE )
{
  echo 'Value could not be unserialized<br>';
  echo $valueToUnserialize;
} else {
  echo 'Value was unserialized!<br>';
  var_dump( $unserialized );
}

এবং এটা আসলে কাজ করে। শুধুমাত্র phav_errormsg কীভাবে $ php_errormsg কাজ করে তার জন্য একটি নিবন্ধিত ত্রুটি হ্যান্ডলার আছে যদি এটি সম্ভবত বিরতি হবে।


যদি $ স্ট্রিং একটি সিরিয়ালাইজড false মান হয়, অর্থাত $string = 'b:0;' SoN9ne এর ফাংশন false ফেরত, এটা ভুল

তাই ফাংশন হবে

/**
 * Check if a string is serialized
 * @param string $string
 */
public static function is_serial($string) {
    return (@unserialize($string) !== false || $string == 'b:0;');
}

একটি ফাংশন নির্মাণ

function isSerialized($value)
{
   return preg_match('^([adObis]:|N;)^', $value);
}

আমি এই কোড লিখতে না, এটা আসলে ওয়ার্ডপ্রেস থেকে। চিন্তা আমি আগ্রহী কেউ জন্য এটি অন্তর্ভুক্ত চাই, এটা overkill হতে পারে কিন্তু এটি কাজ করে :)

<?php
function is_serialized( $data ) {
    // if it isn't a string, it isn't serialized
    if ( !is_string( $data ) )
        return false;
    $data = trim( $data );
    if ( 'N;' == $data )
        return true;
    if ( !preg_match( '/^([adObis]):/', $data, $badions ) )
        return false;
    switch ( $badions[1] ) {
        case 'a' :
        case 'O' :
        case 's' :
            if ( preg_match( "/^{$badions[1]}:[0-9]+:.*[;}]\$/s", $data ) )
                return true;
            break;
        case 'b' :
        case 'i' :
        case 'd' :
            if ( preg_match( "/^{$badions[1]}:[0-9.E-]+;\$/", $data ) )
                return true;
            break;
    }
    return false;
}

এই আমার জন্য জরিমানা কাজ করে

<?php

function is_serialized($data){
    return (is_string($data) && preg_match("#^((N;)|((a|O|s):[0-9]+:.*[;}])|((b|i|d):[0-9.E-]+;))$#um", $data));
    }

?>

/**
 * some people will look down on this little puppy
 */
function isSerialized($s){
if(
    stristr($s, '{' ) != false &&
    stristr($s, '}' ) != false &&
    stristr($s, ';' ) != false &&
    stristr($s, ':' ) != false
    ){
    return true;
}else{
    return false;
}

}

আমি বলতে চাই, এটি unserialize চেষ্টা করুন ;-)

ম্যানুয়াল উদ্ধৃত:

যদি পাস করা স্ট্রিংটি অকার্যকর না হয়, FALSE ফিরে দেওয়া হয় এবং E_NOTICE জারি করা হয়।

সুতরাং, আপনাকে ফেরত মানটি false বলে কিনা তা যাচাই করতে হবে ( না === বা !== , নিশ্চিত !== যে 0 বা null অথবা কোনটি false সমান কোনও সমস্যা নেই, আমি বলব)

শুধু নোটিশ সাবধান: আপনি @ অপারেটর ব্যবহার করতে চান / প্রয়োজন হতে পারে।

এই ক্ষেত্রে :

$str = 'hjkl';
$data = @unserialize($str);
if ($data !== false) {
    echo "ok";
} else {
    echo "not ok";
}

আপনি পাবেন:

not ok


সম্পাদনা করুন: ওহ, এবং @ পিটারের মত (ধন্যবাদ তাকে!), যদি আপনি একটি বুলিয়ান মিথ্যা প্রতিনিধিত্বকে অকার্যকর করার চেষ্টা করছেন, তাহলে আপনার সমস্যা হতে পারে :-(

সুতরাং, আপনার সিরিয়ালাইজড স্ট্রিংটি " b:0; " এর সমান নয় তা পরীক্ষা করাও সহায়ক হতে পারে তা পরীক্ষা করে দেখুন; এই মত কিছু কৌশল করা উচিত, আমি মনে করি:

$data = @unserialize($str);
if ($str === 'b:0;' || $data !== false) {
    echo "ok";
} else {
    echo "not ok";
}

অনিশ্চিতকরণের চেষ্টা করার আগে বিশেষ কেসটি পরীক্ষা করা একটি অপ্টিমাইজেশান হবে - তবে সম্ভবত এটি কার্যকর নয়, যদি আপনার কাছে প্রায়ই ক্রমিক সিরিয়ালাইজড মান না থাকে।


Pascal মার্টিন এর প্রতিক্রিয়া অপ্টিমাইজ করা

/**
 * Check if a string is serialized
 * @param string $string
 */
public static function is_serial($string) {
    return (@unserialize($string) !== false);
}




serialization