substr在通配符子字符串之前查找所有文本

时间:2015-04-02 16:41:22

标签: php string wildcard substr strpos

我要做的是在通配符子字符串之前获取所有字符。例如,如果我有以下字符串:

I.Want.This.Bit.D00F00.Non.Of.This

所以,我希望输出为I.Want.This.Bit

D中的FD00F00总是会在那里,但中间的整数会发生变化。因此可能是D13F02D01F15DF之后的整数不会超过2个。

我曾考虑过做以下事情,但后来意识到它不会起作用:

$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

非常感谢任何指导。

4 个答案:

答案 0 :(得分:2)

可能最好使用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);

在这种情况下,您想要的捕获组将在$ matches [1]中。

您可以在此处使用/测试正则表达式:https://regex101.com/r/sM4wN9/1

答案 1 :(得分: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];

答案 2 :(得分:0)

看看这个问题并回答堆栈溢出。

How do I find the index of a regex match in a string?

您可以对D [0-9] {2} F [0-9] {2}运行正则表达式以获取D的索引,然后将其传递到您的substr中,这将为您提供上半部分。只有在出于某种原因你想要保留的部分中的通配符时,才会出现问题。

希望有所帮助!

答案 3 :(得分:0)

您可以使用正则表达式(https://php.net/manual/en/book.pcre.php),例如

$subString = preg_replace('~\.D\d{2}+F\d{2}\..*$~', '', $string);