Совпадение числа перед подстрокой, но не перед буквой - PullRequest
0 голосов
/ 07 февраля 2019

Я создал код, соответствующий атрибуту гигабайта в описании продукта.Проблема в том, что он соответствует всему между [пробелом] и «ГБ», но мне бы хотелось, чтобы он совпадал только с цифрами (а не буквами или чем-то еще) между пробелом и «ГБ».В противном случае ничего не должно возвращаться.

Это для плагина All-import для Wordpress.

//Extract gigabyte  

    function getFirstGB($str){

        //Remove space between numbers and GB
        $newString = str_replace(' GB', 'GB', $str);



        //Remove period in numbers
        $my = str_replace('.', '', $newString);

        if (preg_match("/(\d+)GB/", $my, $matches)) {
            $check = $matches[1];
        } else {
            $check = "";
        }
        if(strlen($check) < 10) {
            $media = $check;
        }
        else {
            $media = "";
        }
        //Add Gb only if it is not empty
        if (!empty($media)) {
            $island = $media . " Gb";
        }
        else {
        $island = "";
        }
            echo $island;
        }

        $media = "Samsung V7 V71700016GBD Memory";

        getFirstGB($media); 

Для строки: 'V7 V71700016GBD Memory Card' Я ожидаю, что ничего не будет возвращено, но он вернется: 71700016 Гб

Нет проблем с такими строками: "Sony 200GB MP3 10 Вт" Возвращает то, что я хотел: 200 Гб

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете добавить пробел перед вашим шаблоном [ ](\d+)GB или если совпадение также может произойти в начале строки, вы можете утверждать, что то, что слева, не является пробелом, используя (?<!\S):

(?<!\S)(\d+)GB

Regex demo

Если ГБ не может быть частью более длинного слова, вы можете добавить границу слова \b в конце:

(?<!\S)(\d+)GB\b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...