Я пытаюсь получить все символы перед подстрокой подстановочного знака. Например, если у меня есть следующая строка:
I.Want.This.Bit.D00F00.Non.Of.This
Итак, я хочу, чтобы результат был I.Want.This.Bit
D
и F
в D00F00
всегда будут там, но целые числа в промежутке изменится. Так может быть D13F02
, или же D01F15
, Будет не более 2 целых чисел после D
и F
,
Я думал о том, чтобы сделать следующее, но потом понял, что это не сработает:
$string = "I.Want.This.Bit.D00F00.Non.Of.This"$substring = substr($string, 0, strpos($string, '.D'));
Причина, по которой это не сработает, заключается в том, что есть шанс, что часть строки, которую я хочу сохранить, может иметь .D
в нем, например The.Daft.String.D03F12
, Используя этот пример, все, что я хотел бы получить, это The
в качестве выхода, а не The.Daft.String
,
Любое руководство будет высоко ценится.
Вероятно, лучше использовать для этого preg_match, так как вы хотите захватить определенную часть строки. Используйте группу захвата регулярных выражений.
<?php
$pattern = "/^([A-Za-z\.]+)\.D[0-9]{2}F[0-9]{2}/";
$subject = "I.Want.This.Bit.D00F00.Non.Of.This";
preg_match($pattern, $subject, $matches);
print_r($matches);
В этом случае захваченная группа, которую вы хотите, будет в $ match [1].
Вы можете поиграть с / протестировать регулярное выражение здесь: https://regex101.com/r/sM4wN9/1
Вот фрагмент рабочего кода (с Devins Regexp):
$string = "I.Want.This.Bit.D00F00.Non.Of.This";
preg_match('/(.*)D[0-9]{2}F[0-9]{2}/', $string, $matches);
echo $matches[1];
Посмотрите на этот вопрос и ответьте на переполнение стека.
Как мне найти индекс соответствия регулярному выражению в строке?
Вы можете запустить регулярное выражение для D [0-9] {2} F [0-9] {2}, чтобы получить индекс D, а затем передать его в ваш substr, и это даст вам первую половину. Проблема может возникнуть только в том случае, если по какой-то причине в той части, которую вы хотите сохранить, есть ваш шаблон.
Надеюсь, это поможет!
Вы можете использовать регулярные выражения для этого (https://php.net/manual/en/book.pcre.php), например
$subString = preg_replace('~\.D\d{2}+F\d{2}\..*$~', '', $string);