我想从一个更大的字符串 ($str) 中取出 GP123(一个由任意顺序的数字和字符组成的字符串)并排除 Hello ($str1),它将是另一个变量中的字符串。我的代码是这样的。但它不起作用。如何删除字符串的一部分。
$str=" HelloGP123";
$str1="Hello";
preg_match_all("/(?:$str1)\w+\d+\w+/",$str,$str2);
print_r($str2);
我想从一个更大的字符串 ($str) 中取出 GP123(一个由任意顺序的数字和字符组成的字符串)并排除 Hello ($str1),它将是另一个变量中的字符串。我的代码是这样的。但它不起作用。如何删除字符串的一部分。
$str=" HelloGP123";
$str1="Hello";
preg_match_all("/(?:$str1)\w+\d+\w+/",$str,$str2);
print_r($str2);
好吧,我的需要只是从 $str (HelloGP123) 中删除 $str1(Hello) 部分并将最后的剩余部分存储在 $str2 中。而且我到处都是正则表达式。
但我意识到这可以通过字符串替换以更简单的方式解决。所以这就是我所做的并且它奏效了。
$str2= str_ireplace($str1, '', $str);
我想这是最简单的方法,而不是通过尝试各种正则表达式组合来冲击我们的大脑。
preg_replace("/hello/","","hellogp123");
为什么不是上面那个?
$pattern = sprintf('/(?<=%s)[a-zA-Z0-9]+/', preg_quote($str1, '/'));
if (preg_match($pattern, $str, $matches)) {
$str2 = $matches[0];
}
这将匹配任何字母和/或数字的组合,但仅匹配紧跟在$str1
.
$string="HelloGP123";
$pattern="/Hello/";
echo preg_replace($pattern, "", $string);
您的代码不起作用有几个原因:
(?:$str1)
实际上是在尝试匹配字符串中的 'hello'。这是因为(?:)
它是一个非捕获子模式,这并不意味着结果中的任何内容都不会返回(这似乎是您尝试使用它的方式),但子模式不会作为自己的返回匹配数组中的条目。\w+\d+\w+
表示“一个或多个单词字符,后跟一个或多个数字,后跟一个或多个单词字符”,其中“单词”字符是字母、数字或下划线。这不是您所说的要匹配的内容。这是一些可以执行您所说的代码:
$str_minus_str1 = preg_replace('/'.preg_quote($str1,'/').'/',' ',$str);
preg_match_all('/[0-9A-Za-z]+/',$str_minus_str1,$matches);
请注意,我已将字符串中的 $str1 替换为 ' ' 而不是删除它,因为例如,如果 $str 是“applehellobanana”,您可能希望将 'apple' 和 'banana' 作为单独的匹配项返回,而不是只是匹配'applebanana'。
如果您想将整个内容作为单个字符串返回,这似乎是您的意图,那么您需要使用类似于以下内容的内容来内爆您的匹配项
$str2 = implode('',$matches);