У меня есть динамический контент, но некоторые символы из строки отсутствуют. Я хочу заменить эти символы, чтобы сделать это правильно. У меня есть полный идентификатор заказа, но в его содержании есть пробел.
Это пример содержимого:
$content = "Order is purchased on 23-05-2023.Order is in progress  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.";
Смущенный. Какой из них правильный полный идентификатор заказа? JKSZ089P6X07A07012 или JKSZ089P6X07 012? Куда пропал A07?
Я не уверен, но до сих пор я проверял содержимое и обнаружил, что перед последними тремя символами идет пробел. Потому что контент динамичен.
это правильный идентификатор заказа JKSZ089P6X07A07012. В контенте я всегда получаю место в идентификаторе заказа
Помогает, если вы показываете, что используете действительный, синтаксически правильный PHP-код.
Также помогает, если имена переменных имеют смысл! Игнорирование синтаксической ошибки, подбор 12 символов и вызов переменной $fisrt9Char не помогает $fisrt9Char = substr(orderId ,0,12);
Цитата: «У меня есть динамичный контент». Первое появление id правильное, второе нет. Не имеет ли смысл попытаться исправить это в провайдере контента?
Было бы полезно, если бы вы показали 1) Я начинаю с этого. а затем 2) Я хочу получить этот результат. Это помогает, когда описание не слишком полезно.
Это нормально? я отредактировал свой вопрос.
@parv только с одним образцом строки, у нас недостаточно понимания изменчивости вашей входной строки. Пожалуйста, предоставьте больше примеров, охватывающих самые сложные сценарии.
Почему бы просто не исправить исходные данные? Что бы ни создавало этот контент, оно явно знало правильный идентификатор, поэтому тот факт, что оно печатает его неправильно во второй раз, является ошибкой, которую создатели должны просто исправить.
@parv, вы сотрудничаете с этим пользователем, пытаясь добавить неоднозначные и странные задачи в Stack Overflow ? Что происходит с этими странными видоизмененными строками, в которых за буквой следуют две цифры, что мешает работе вашего приложения? Где-то пахнет кодом.






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";
Я попробовал это. не могли бы вы обновить его, так как у меня уже есть идентификатор заказа
Ваш набор образцов входных данных показывает, что проблема с пробелами постоянно возникает после 12 символов.
Чтобы восстановить строку с помощью $orderId, создайте шаблон регулярного выражения, который заменяет 3 символа после 12-го символа «выражением с одним или несколькими пробелами». Я заключаю шаблон в границы слов, чтобы исключить вероятность ложноположительных замен (искажение непреднамеренных подстрок). Если совпадение есть, замените его известным значением $orderId.
Код: (Демо)
$regex = '#\b' . substr_replace($orderId, '\s+', 12, 3) . '\b#';
var_export(preg_replace($regex, $orderId, $content));
Если на самом деле заменяемые пробелы — это , то вот модификация моего приведенного выше шаблона регулярного выражения. (Демо)
$regex = '#\b' . substr_replace($orderId, '(?: )+', 12, 3) . '\b#';
Это не работает. Возможно, это связано с . Когда я проверяю содержимое приходит на место космоса.
Что ж, моя демонстрация доказывает, что мое решение работает с образцом ввода в вашем вопросе. Итак, следующий шаг — выяснить, почему входная строка вашего вопроса не идентична входной строке вашего проекта. Если у вас есть вместо пробелов, отредактируйте свой вопрос, чтобы уточнить это.
я обновил рассматриваемый контент
@parv как насчет этого: 3v4l.org/ElC4g
Также можно сказать, что вы можете заранее очистить строку, заменив все подстроки буквальным пробелом.
огромное спасибо @mickmackusa. Теперь работает.
Всегда ли пробел находится непосредственно перед последними тремя символами идентификатора заказа? Или может каждый раз быть разным?