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);