说我有以下内容: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在哪里完成,然后删除其余部分。
答案 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
重置匹配信息。在替换中,我们只使用空字符串。
请注意,{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开头并以一位或两位数结尾的单词匹配。