使用正则表达式从字符串中提取内容的PHP

3

我有以下字符串,我想从中提取“383-0408”,显然内容会改变,但是零件号始终跟随字符串“Our Stk#:”,我该如何最优雅地从字符串中提取此信息?

Microchip Technology Inc.
18 PIN, 7 KB FLASH, 256 RAM, 16 I/O 

Mfr's Part #: PIC16F648A-I/SO 
Our Stk #: 383-0408
4个回答

2

你可以这样做:

<?php

$str = "Microchip Technology Inc.
18 PIN, 7 KB FLASH, 256 RAM, 16 I/O 

Mfr's Part #: PIC16F648A-I/SO 
Our Stk #: 383-0408";

if (preg_match('/Our Stk #: (\d*-\d*)/', $str, $matches)) {
    echo $matches[1];
}

只有当您要查找的数字部分始终具有“digits-digits”的形式时,此方法才有效。@Richard86为您的问题提供了另一个通用解决方案,可以处理任何数字和任意数量的破折号。

编辑:

为了避免在破折号周围没有数字的情况下,如@Richard86在评论中所说,正则表达式应该像这样:

if (preg_match('/Our Stk #: (\d+-\d+)/', $str, $matches)) {

这个解决方案更适合匹配 数字-数字 的形式,这可能是 @Timothy 使用的方式。无论如何,感谢您提供了证书。 (如果要排除只有破折号的 Stk#(例如 Our Stk#:-),则可以将 (\ d * - \ d *) 更改为 (\ d + - \ d +)。) - AndersTornkvist
@Richard86 你说得完全正确。实际上,我将编辑答案以指出这一点。 - Nicolás Ozimica

2
$string = 'YOURSTRING';
$offset = strpos($string, 'Out Stk #') + 11;
$final = substr($string, $offset, 8);

如果我们不知道数字的长度,然后假设在数字后面是空格,那么:

$string = 'YOURSTRING';
$offset = strpos($string, 'Out Stk #') + 11;
$end = strpos($string, ' ', $offset);
$final = substr($string, $offset, $end-$offset);

我按照您的方式做了,但我发现其他答案更适合这个问题。 - Dominik
@Richard86:我们还可以通过查找数字后面的下一个字符来确定其长度...可能只是一个空格。 - Jaanus
1
@Timothy 我只是想告知未来的读者,即使对我们大多数人来说这可能是显而易见的。很多时候 substr() 是更好的选择。 - AndersTornkvist

2

你可以使用:

if (preg_match( '/Our Stk #: ([0-9\\-]+)/', $str, $match ))
    echo $match[1];

1
<?php

$text = "Microchip Technology Inc.
18 PIN, 7 KB FLASH, 256 RAM, 16 I/O 

Mfr's Part #: PIC16F648A-I/SO 
Our Stk #: 383-0408";

preg_match('/Our Stk #: (.*)/', $text, $result);
$stk = $result[1];

?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接