Заменить поврежденную буквенно-цифровую подстроку идентификатора, содержащую нежелательные пробелы

У меня есть динамический контент, но некоторые символы из строки отсутствуют. Я хочу заменить эти символы, чтобы сделать это правильно. У меня есть полный идентификатор заказа, но в его содержании есть пробел.

  1. Мне нужно заменить идентификатор заказа, в котором есть пробел, на правильный идентификатор заказа.
  2. У меня правильный идентификатор заказа

Это пример содержимого:

$content = "Order is purchased on 23-05-2023.Order is in progress&nbsp and you can see order status on website by enter id JKSZ089P6X07   012";

$content = "Order Model is Ford and year model 2017.Order id is 6FTYF75C7HD  715 and Vehicle type is commercial.";                     

$content = "Order Model is Mahindra and year model 2015.Order id is 9PKKJ7FS3CD  890 and Vehicle type is personal.";

Мой код:

$orderId = "JKSZ089P6X07A07012";
$getChar =  substr(orderId ,0,12);

if (strpos( $content, $getChar ) !== false ) { 
    echo "found";
    $content = str_replace($getChar," ",$content);
}

echo $content;

Выходной контент должен быть

$content = "Order is purchased on 23-05-2023.Order is in progress and you can see order status on website by enter id JKSZ089P6X07A07012";

$content = "Order Model is Ford and year model 2017.Order id is 6FTYF75C7HD680715 and Vehicle type is commercial.";                   

$content = "Order Model is Mahindra and year model 2015.Order id is 9PKKJ7FS3CD347890 and Vehicle type is personal.";

Всегда ли пробел находится непосредственно перед последними тремя символами идентификатора заказа? Или может каждый раз быть разным?

ADyson 13.09.2023 14:33

Смущенный. Какой из них правильный полный идентификатор заказа? JKSZ089P6X07A07012 или JKSZ089P6X07 012? Куда пропал A07?

brombeer 13.09.2023 14:41

Я не уверен, но до сих пор я проверял содержимое и обнаружил, что перед последними тремя символами идет пробел. Потому что контент динамичен.

parv 13.09.2023 14:42

это правильный идентификатор заказа JKSZ089P6X07A07012. В контенте я всегда получаю место в идентификаторе заказа

parv 13.09.2023 14:43

Помогает, если вы показываете, что используете действительный, синтаксически правильный PHP-код.

RiggsFolly 13.09.2023 14:45

Также помогает, если имена переменных имеют смысл! Игнорирование синтаксической ошибки, подбор 12 символов и вызов переменной $fisrt9Char не помогает $fisrt9Char = substr(orderId ,0,12);

RiggsFolly 13.09.2023 14:47

Цитата: «У меня есть динамичный контент». Первое появление id правильное, второе нет. Не имеет ли смысл попытаться исправить это в провайдере контента?

lukas.j 13.09.2023 14:47

Было бы полезно, если бы вы показали 1) Я начинаю с этого. а затем 2) Я хочу получить этот результат. Это помогает, когда описание не слишком полезно.

RiggsFolly 13.09.2023 14:53

Это нормально? я отредактировал свой вопрос.

parv 13.09.2023 15:28

@parv только с одним образцом строки, у нас недостаточно понимания изменчивости вашей входной строки. Пожалуйста, предоставьте больше примеров, охватывающих самые сложные сценарии.

mickmackusa 14.09.2023 12:47

Почему бы просто не исправить исходные данные? Что бы ни создавало этот контент, оно явно знало правильный идентификатор, поэтому тот факт, что оно печатает его неправильно во второй раз, является ошибкой, которую создатели должны просто исправить.

ADyson 14.09.2023 13:03

@parv, вы сотрудничаете с этим пользователем, пытаясь добавить неоднозначные и странные задачи в Stack Overflow ? Что происходит с этими странными видоизмененными строками, в которых за буквой следуют две цифры, что мешает работе вашего приложения? Где-то пахнет кодом.

mickmackusa 14.09.2023 23:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
12
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

function correctString(string $content): false|string {

  $len = 18;       // The length of the id
  $minLen1 = 12;   // The minimum length of the first part of the malformed id
  $minLen2 = 3;    // The minimum length of the second part of the malformed id
                   // Of course minLen1 + minLen2 should be smaller than $len

  preg_match_all("/[A-Z0-9]{{$len}}/", $content, $matches);

  if (count($matches[0]) === 2 && $matches[0][0] === $matches[0][1]) {

    // Found valid id, and also the second, and it they are identical
    return $content;

  } elseif (count($matches[0]) === 1) {

    // Found valid id, but not the second one
    $part1 = substr($matches[0][0], 0, $minLen1);
    $part2 = substr($matches[0][0], $len - $minLen2, $minLen2);
    preg_match_all("/$part1 $part2/", $content, $matches2);

    if (count($matches2[0]) === 1) {

      // Found second, but malformed id
      return str_replace($matches2[0][0], $matches[0][0], $content);
      
    } else {

      // Found no second malformed id
      return false;

    }

  } else {

    // Found no id at all
    return false;

  }

}

echo correctString('Order ... is JKSZ089P6X07A07012.Order is ... id JKSZ089P6X07 012') .  "\n";
echo correctString('Order ... is JKSZ089P6X07A07012.Order is ... id JKSZ089P6X07A07012') .  "\n";
echo correctString('Order ... is JKSZ089P6X07A0701.Order is ... id JKSZ089P6X07 012') .  "\n";

Выход:

  Order ... is JKSZ089P6X07A07012.Order is ... id JKSZ089P6X07A07012
  Order ... is JKSZ089P6X07A07012.Order is ... id JKSZ089P6X07A07012
                      <- Echoing false prints as an empty line 

нам не нужно находить правильный идентификатор из контента. У меня уже есть идентификатор заказа, как я упоминал выше в коде $orderId = "JKSZ089P6X07A07012";

parv 13.09.2023 16:44

Я попробовал это. не могли бы вы обновить его, так как у меня уже есть идентификатор заказа

parv 13.09.2023 19:11
Ответ принят как подходящий

Ваш набор образцов входных данных показывает, что проблема с пробелами постоянно возникает после 12 символов.

Чтобы восстановить строку с помощью $orderId, создайте шаблон регулярного выражения, который заменяет 3 символа после 12-го символа «выражением с одним или несколькими пробелами». Я заключаю шаблон в границы слов, чтобы исключить вероятность ложноположительных замен (искажение непреднамеренных подстрок). Если совпадение есть, замените его известным значением $orderId.

Код: (Демо)

$regex = '#\b' . substr_replace($orderId, '\s+', 12, 3) . '\b#';

var_export(preg_replace($regex, $orderId, $content));

Если на самом деле заменяемые пробелы — это &nbsp;, то вот модификация моего приведенного выше шаблона регулярного выражения. (Демо)

$regex = '#\b' . substr_replace($orderId, '(?:&nbsp;)+', 12, 3) . '\b#';

Это не работает. Возможно, это связано с &nbsp; . Когда я проверяю содержимое &nbsp; приходит на место космоса.

parv 18.09.2023 08:10

Что ж, моя демонстрация доказывает, что мое решение работает с образцом ввода в вашем вопросе. Итак, следующий шаг — выяснить, почему входная строка вашего вопроса не идентична входной строке вашего проекта. Если у вас есть &nbsp; вместо пробелов, отредактируйте свой вопрос, чтобы уточнить это.

mickmackusa 18.09.2023 08:14

я обновил рассматриваемый контент

parv 18.09.2023 08:17

@parv как насчет этого: 3v4l.org/ElC4g

mickmackusa 18.09.2023 08:18

Также можно сказать, что вы можете заранее очистить строку, заменив все подстроки &nbsp; буквальным пробелом.

mickmackusa 18.09.2023 23:22

огромное спасибо @mickmackusa. Теперь работает.

parv 20.09.2023 09:10

Другие вопросы по теме