首页 > 解决方案 > PHP从字符串中提取特定字符

问题描述

我有下面的字符串

$LINE = TCNU1573105  HDPE HTA108  155   155  000893520918 PAL990  25.2750 MT  28.9750 MT

我想PAL990从上面的字符串中提取。实际提取 PAL990 字符串或任何具有 PAL 后跟一些数字的字符串,如 PAL222 或 PAL123

我尝试了很多方法,但无法得到结果。我用了,

substr ( $LINE, 77, 3) 

但是当不同位置的值我得到错误的值时。

标签: phpregex

解决方案


您可以使用

$LINE = "TCNU1573105  HDPE HTA108  155   155  000893520918 PAL990  25.2750 MT  28.9750 MT";
if (preg_match('~\bPAL\d+\b~', $LINE, $res)) {
    echo $res[0]; // => PAL990
}

请参阅PHP 演示此正则表达式演示

细节

  • \b- 单词边界
  • PAL- 一个PAL子串
  • \d+- 1+ 位数
  • \b- 单词边界。

preg_match函数将返回第一个匹配项。

请注意,如果您的字符串在连字符/空格之间包含类似的字符串,您将不再能够依赖单词边界,然后使用自定义空格边界,即:

'~(?<!\S)PAL\d+(?!\S)~'

看到这个正则表达式演示

编辑

如果您可能在PAL和 数字之间有一个可选的空格,您可以使用

preg_replace('~.*\b(PAL)\s?(\d+)\b.*~s', '$1$2', $LINE)

请参阅此 PHP 演示此正则表达式演示

或者,将您需要的字符串与空格匹配,然后将其删除:

if (preg_match('~\bPAL ?\d+\b~', $LINE, $res)) {
    echo str_replace(" ", "", $res[0]);
}

查看另一个 PHP 演示

请注意,这?使得前面的模式是可选的(匹配 1 或 0 次)。


推荐阅读