0

这更像是一个通用的正则表达式问题,而不是特定于 PHP 的问题。

我得到了不同的字符串,可能看起来像:

A/B/PA ID U/C/D

我正在尝试使用以下方法提取中间斜杠中包含空格(“/PA ID U”)的段:

preg_match('/(\/PA .+)(\/.+|$)/', $string, $matches);

然而,我得到的不是“/PA ID U”,而是“/PA ID U/C/D”。

如何使它在最后一组中优先匹配“/.+”而不是“$”?


补充笔记:

我需要最后一组来匹配另一个“/somethingsomthing”或“”,因为字符串变化很大。如果我只匹配“/.+”,如果它位于行尾,例如“A/B/PA ID U”,我将无法获得“/PA ID U”。

基本上,我需要能够像这样提取特定的段:

鉴于: "A/B/PA ID U/PA ID U/C/D"

提炼: (A), (B), (PA ID U), (PA ID U), (C), (D)


[更新]

我试图避免使用split()orexplode()因为这意味着我必须单独匹配“PA ID U”模式。除了仅提取斜杠分隔的段之外,我还需要验证子字符串是否与特定模式匹配。

4

4 回答 4

2

我认为你可以最有效地使用 split 来完成你想要的。

split('/',$string);

见:php手册

于 2009-02-19T07:07:32.937 回答
1

您的正则表达式不起作用,因为它.+是贪婪的。您可以通过将非贪婪修饰符 (a ?) 添加到您的第一个修饰符来修复它.+

preg_match('/(\/PA .+?)(\/.+|$)/', '', $matches);

您也可以这样做:

'/\/(PA [^\/]+)(\/.+|$)/'

我将斜线移到括号之外以避免捕获它(我想你对斜线不感兴趣)。将[^\/]+捕获直到下一个斜杠的任何字符。

于 2009-02-19T07:25:06.763 回答
0

内克拉米雷斯,

(\w+\s?)+

应该管用

于 2009-02-19T07:11:25.657 回答
0

通过在否定字符类中写入定界字符或使用定界符作为文字字符进行拆分来匹配。

代码:(演示

$string = 'A/B/PA ID U/PA ID U/C/D';

// get only first value starting with PA:
echo preg_match('~PA[^/]+~', $string, $match) ? $match[0] : '';

echo "\n---\n";

// get all values strings with PA:
var_export(preg_match_all('~PA[^/]+~', $string, $matches) ? $matches[0] : []);

echo "\n---\n";

// get all delimited values:
var_export(explode('/', $string));

输出:

PA ID U
---
array (
  0 => 'PA ID U',
  1 => 'PA ID U',
)
---
array (
  0 => 'A',
  1 => 'B',
  2 => 'PA ID U',
  3 => 'PA ID U',
  4 => 'C',
  5 => 'D',
)
于 2021-03-10T13:49:49.263 回答