Как мы можем отделить строку только по ее начальным символам в PHP - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь отделить очень длинную строку, начальный тег которой 2424 ... Это функция, в которой она делает это

protected function StartTagCheckAndNeglect($hex)
       {
       try {

        $token = strtok($hex, "2424");

        while ($token !== false) {
            echo "$token<br>";
            $token = strtok("(2424)");
        }

    } catch (Exception $e) {
        echo $e->getMessage();
    }

}

$ hex имеет очень длинную шестнадцатеричную строку ... THEПРОБЛЕМА вместо только разделяющей строки, которая начинается с 2424 .... она разбивает любую вещь, которая начинается с 2 или 4. Пример: 24246778672552dd455 Это дает: 4677867, 55, дд, 55 Что я хочу, это 6778672552dd455 в одну строкудо следующего 2424. Любое лучшее решение будет полезно.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Простой способ - использовать explode() с 2424 в качестве разделителя.Затем вы можете проверить, является ли первый элемент пустым (так что перед первыми 2424 нет ничего) и есть ли более 1 элемента (используя count()) ...

$test = "24246778672552dd4552424a123";

$results = explode("2424", $test);
if ( empty($results[0]) && count($results) > 1 )   {
    //found
    array_shift($results);   // Remove empty element
    print_r($results);
}

output ...

Array
(
    [0] => 6778672552dd455
    [1] => a123
)

Проблема с strtok() заключается в том, что она будет разбивать строку на основе ЛЮБЫХ символов в вашей строке, поэтому она будет делиться либо на 2, либо на 4, а не на 2424.Из руководства ...

strtok () разбивает строку (str) на меньшие строки (токены), причем каждый токен отделяется любым символом из токена.

0 голосов
/ 16 октября 2018

Вы можете просто использовать preg_split, чтобы разбить ваши данные на массивы.

$hex = '24246778672552dd45524248763257490823508lale9794382';
$hexarray = preg_split("/(2424)/", $hex);
print_r($hexarray);

// expected result
// Array ( [0] => [1] => 6778672552dd455 [2] => 8763257490823508lale9794382 )
...