我有一个像这样的复杂字符串
{},\"employees\":{},\"idIwant\":{\"2545\":{\"attributes\":{\"offset\":9855,
我需要从此字符串中删除甜味2545
,我尝试使用正则表达式和strpos,但它在很多冒号,方括号和斜杠之间的效果不佳。是否可以提取idIwant
(即2545
之后的数字?
这实际上是来自网站的源代码,它不是json而是redux状态字符串。
答案 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
对模式的开头部分进行字面解释:
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];
答案 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\\":{\\"(.+?)\\.+
$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;