1

我想从一个更大的字符串 ($str) 中取出 GP123(一个由任意顺序的数字和字符组成的字符串)并排除 Hello ($str1),它将是另一个变量中的字符串。我的代码是这样的。但它不起作用。如何删除字符串的一部分。

$str=" HelloGP123";
$str1="Hello";
preg_match_all("/(?:$str1)\w+\d+\w+/",$str,$str2);
print_r($str2); 
4

5 回答 5

1

好吧,我的需要只是从 $str (HelloGP123) 中删除 $str1(Hello) 部分并将最后的剩余部分存储在 $str2 中。而且我到处都是正则表达式。

但我意识到这可以通过字符串替换以更简单的方式解决。所以这就是我所做的并且它奏效了。

$str2= str_ireplace($str1, '', $str);

我想这是最简单的方法,而不是通过尝试各种正则表达式组合来冲击我们的大脑。

于 2012-07-18T19:04:07.933 回答
0
preg_replace("/hello/","","hellogp123");

为什么不是上面那个?

于 2012-07-17T06:55:18.287 回答
0
$pattern = sprintf('/(?<=%s)[a-zA-Z0-9]+/', preg_quote($str1, '/'));

if (preg_match($pattern, $str, $matches)) {
    $str2 = $matches[0];
}

这将匹配任何字母和/或数字的组合,但仅匹配紧跟在$str1.

这里的例子 - http://codepad.viper-7.com/okY8TP

另见 - http://www.regular-expressions.info/lookaround.html

于 2012-07-17T06:55:51.843 回答
0
$string="HelloGP123";
$pattern="/Hello/";
echo preg_replace($pattern, "", $string);
于 2012-07-17T06:56:46.043 回答
0

您的代码不起作用有几个原因:

  • 首先(?:$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);
于 2012-07-17T15:05:17.620 回答