如何匹配正则表达式,在匹配后删除所有内容

时间:2018-06-28 16:07:22

标签: php regex

说我有以下内容:preg_match("/ESP[0-9]?[0-9]/", $devid)

我要匹配以下数据:
$devid = "ESP1"
$devid = "ESP10"
$devid = "ESP78"

但是,我不希望该字符串包含正则表达式中不匹配的任何内容。例如: $devid = "ESP100"将返回ESP10
$devid = "ESP10234234"将返回ESP10
$devid = "ESP78hello"将返回ESP78

...如果没有匹配项,则返回null(或等效值)。

从某种意义上说,我想检测preg_match在哪里完成,然后删除其余部分。

3 个答案:

答案 0 :(得分:3)

您可以将preg_replace与捕获组一起使用:

$devid = preg_replace('/^(ESP\d{1,2}+).+/', '$1', $devid);

此正则表达式匹配并捕获我们要保留在第1组中的文本,在替换时,我们放回$1

或没有捕获组,请使用匹配重置\K

$devid = preg_replace('/^ESP\d{1,2}+\K.+/', '', $devid);

此正则表达式匹配我们要保留的文本,然后使用\K重置匹配信息。在替换中,我们只使用空字符串。

RegEx Demo

请注意,{1,2}+匹配1到2次,且匹配次数尽可能多,不作回报

答案 1 :(得分:2)

您可以在preg_match中使用第三个参数,例如:

preg_match('/ESP\d\d?/', $string, $matches);
var_dump($matches[0] ?? NULL);

如果找不到任何内容,将输出NULL

编辑(cars10m):
通过rextester.com中的测试,我发现$ matches作为长度为0的数组返回,但未找到任何内容,请参见:http://rextester.com/UUM57869

答案 2 :(得分:0)

我相信您需要边界preg_match("/\bESP\d{1,2}\b/", $devid, $match); 一词。

asyncio

单词边界确保其与以ESP开头并以一位或两位数结尾的单词匹配。