PHP正则表达式与整个可能的单词不匹配

PHP正则表达式与整个可能的单词不匹配,php,regex,Php,Regex,我正在创建一个脚本,它可以剪切字符串中不需要的部分,但保留其余部分。我有一个奇怪的问题——我创建的正则表达式匹配字符串,但不是所有可能的符号 测试字符串: $itemFullName = "10-16X4 POLI MG SELF START BLK PLASTIC"; “模式”我有: PHP代码: if(preg_match("@(POLI){1}(.)+(BLK)@", $itemFullName)) { $itemAttributes = preg_replace("@(POL

我正在创建一个脚本,它可以剪切字符串中不需要的部分,但保留其余部分。我有一个奇怪的问题——我创建的正则表达式匹配字符串,但不是所有可能的符号

测试字符串:

 $itemFullName = "10-16X4 POLI MG SELF START BLK PLASTIC";
“模式”我有:

PHP代码:

if(preg_match("@(POLI){1}(.)+(BLK)@", $itemFullName))
{
    $itemAttributes = preg_replace("@(POLI){1}(.)+(BLK)@", "#", $itemFullName);
}
最后,$itemAttributes设置为:

 "10-16X4 #K PLASTIC". 
看起来正则表达式只捕获[POLI-MG-SELF-START BL]K部分,并将其更改为“#”,而不是整个匹配POLI-MG-SELF-START BLK,然后将其替换


如何修复它?

无需在
preg\u replace
之前运行
preg\u match
。如果模式不匹配,您将从
preg\u replace
返回原始字符串。您的正则表达式也需要简化,请尝试以下代码:

$itemAttributes = preg_replace('@\bPOLI\b.*?\bBLK\b@', '#', $itemFullName);

我已将起始字符串和结束字符串包装在
\b
(单词边界)中,以避免匹配意外匹配,如
策略

$itemFullName=“10-16X4 POLI MG SELF START BLK PLASTIC”$itemAttributes=preg_replace(“@(POLI){1}(+(BLK)@)”、“#”、$itemFullName);echo$itemtattributes
这对我来说很有效,可以按预期返回
10-16X4#PLASTIC
。(虽然效率非常低)您也可以简单地使用
@(POLI)(.*)(BLK)@
您还可以删除捕获组,但它们在这里没有任何用处。事实上,“代码> > STARPOED())/代码> />代码>子串(< /代码>)在这里会更有效,尽管代码可能使用正则表达式读得更好。@ DaveRANDOM不,我不能,因为在字符串的中间有一些我不知道的东西(我只有第一个和最后一个字)。
$itemAttributes = preg_replace('@\bPOLI\b.*?\bBLK\b@', '#', $itemFullName);