在带有特殊字符的字符串中查找子字符串PHP

时间:2019-06-08 04:32:02

标签: php regex string

我有一个像这样的复杂字符串

{},\"employees\":{},\"idIwant\":{\"2545\":{\"attributes\":{\"offset\":9855,

我需要从此字符串中删除甜味2545,我尝试使用正则表达式和strpos,但它在很多冒号,方括号和斜杠之间的效果不佳。是否可以提取idIwant(即2545之后的数字?

这实际上是来自网站的源代码,它不是json而是redux状态字符串。

4 个答案:

答案 0 :(得分:3)

按如下所示隔离比赛后的数字:

代码:(Demo

$string = '{},\"employees\":{},\"idIwant\":{\"2545\":{\"attributes\":{\"offset\":9855,';

echo preg_match('~"idIwant\\\":{\\\"\K\d+~', $string, $out) ? $out[0] : 'bonk';

输出:

2545

"\"保持在您寻找的键周围很重要,这样您就可以匹配整个目标关键字(没有无意的子字符串匹配)。

\K重新开始全字符串匹配,因此您不需要使用不必要的元素来充实输出数组。

Php需要3或4 \才能代表模式中的一个。 (以下是一些细分:https://stackoverflow.com/a/15369828/2943403

p.s。另外,您可以像这样强制使用\Q..\E对模式的开头部分进行字面解释:

Demo

echo preg_match('~\Q\"idIwant\":{\"\E\K\d+~', $string, $out) ? $out[0] : 'bonk';

或者如果您害怕这么多元字符,可以降低模式的稳定性,只匹配搜索字符串,然后匹配一个或多个非数字,然后忘记先前匹配的字符,然后匹配1个或多个数字:

echo preg_match('~idIwant\D+\K\d+~', $string, $out) ? $out[0] : 'bonk';

答案 1 :(得分:2)

如果idIwant只有数字,这将起作用。

$string = '{},\"employees\":{},\"idIwant\":{\"2545\":{\"attributes\":{\"offset\":9855,';

preg_match('/idIwant.*?(\d+)/', $string, $matches);

echo $matches[1];

Test

答案 2 :(得分:1)

最简单的方法是:

$String ='{},\"employees\":{},\"idIwant\":{\"2545\":{\"attributes\":{\"offset\":9855,';

$arr1 = explode('"idIwant\":{\"', $String);

如果输出$arr1[1],您将得到:

string=> 2545\":{\"attributes\":{\"offset\":9855,';

您需要:

$arr2 = explode('\":{\"', $arr1[1]);

您将进入$arr2[0]

string=> 2545

如果字符串具有严格的语法

答案 3 :(得分:0)

获取所需数字的方法有很多,其中一种是类似于以下内容的表达式:

.+idIwant\\":{\\"(.+?)\\.+

Demo

测试

$re = '/.+idIwant\\\\":{\\\\"(.+?)\\\\.+/m';
$str = '{},\\"employees\\":{},\\"idIwant\\":{\\"2545\\":{\\"attributes\\":{\\"offset\\":9855,';
$subst = '$1';

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;