我希望在“' minimum'”之前从字符串中获取第一个数字,前面有一个空格,而不是“' - '”。例如:
我尝试使用以下代码:
$str = "Red QQ-4555 White TT-789 Yellow Minimum order applies. This is a test";
$explodeByMinimumArray = preg_split("/minimum/i", str_replace(array( '(', ')' ), ' ', $str));
preg_match_all('/\d+(?!-\d)/', $explodeByMinimumArray[0], $numberFromStringBeforeMinimumArray);
print_r($numberFromStringBeforeMinimumArray);
这将$numberFromStringBeforeMinimumArray
作为:
Array
(
[0] => Array
(
[0] => 4555
[1] => 789
)
)
但是预期的输出是空的,因为QQ-4555和TT-789前面有一些字符。
任何人都可以帮我解决这个问题吗?提前致谢。
答案 0 :(得分:1)
您需要使用负面的lookbehind来确保您不匹配前面带有字母/数字和-
的数字:
(?<![\p{L}\d]-|\d)\d+(?!-\d)
请参阅regex demo。
<强>详情
(?<![\p{L}\d]-|\d)
- 如果有一个字母或数字后跟-
或一个数字紧靠当前位置的左侧,则会导致匹配失败的负面反馈\d+
- 1+位数(?!-\d)
- 如果有一个-
,然后是一个位于当前位置右侧的数字,则会导致匹配失败的否定前瞻答案 1 :(得分:0)
$str = "Red QQ-4555 White TT-789 123 Yellow Minimum order applies. This is a test ";
$explodeByMinimumArray = preg_split("/minimum/i", str_replace(array( '(', ')' ), ' ', $str));
preg_match_all('/\s+\d+(?!-\d)/', $explodeByMinimumArray[0], $numberFromStringBeforeMinimumArray);
print_r($numberFromStringBeforeMinimumArray);
将给出
Array
(
[0] => Array
(
[0] => 123
)
)
答案 2 :(得分:0)
您可以使用多个外观断言来使用此正则表达式:
(?<=\s)\d+\b(?!-\d+)(?=.*Minimum)
<强>解释强>
(?<=\s)
:断言,断言我们在前一个位置有空格\d+\b
:匹配1+位后跟单词边界断言(?!-\d+)
:断言先前声明我们没有-<digits>
提前(?=.*Minimum)
:预见断言我们前面有Minimum
文字