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

substr to find all text before a wildcard substring

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

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

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

DD00F00 中的 F 会一直存在,但中间的整数会发生变化。所以它可能是 D13F02,或 D01F15DF.

后不会超过 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.

任何指导将不胜感激。

看看这个关于堆栈溢出的问题和答案。

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

您可以 运行 针对 D[0-9]{2}F[0-9]{2} 的正则表达式来获取 D 的索引,然后将其传递到您的子字符串中,这将给出你上半场唯一的问题是,如果出于某种原因,您想要保留的部分中有您的通配符。

希望对您有所帮助!

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

$subString = preg_replace('~\.D\d{2}+F\d{2}\..*$~', '', $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);

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

您可以在此处播放 with/test 正则表达式: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];