我遇到了这方面的严重问题,而且我没有足够的经验来理解我应该怎么做。
首先,我有一个很长的字符串,叫做$ VC。每次它略有不同,但总会有一些相同的东西。
$VC
是一个htmlspecialchars()
字符串,类似于
<a href="example.com?continue=pid%3D6057413202557366578%26oid283447094297409">Example Link</a>... Lots of other stuff in between here... 80] ,[] ,"","3245697351286309258",[] ,["812750926... and it goes on ...80] ,[] ,"","6057413202557366578",[] ,["103279554... and it continues on
在这种情况下,<a>
标记始终相同,因此我从那里获取信息。其后列出的数字(例如,"3245697351286309258",[]
和,"6057413202557366578",[]
)也将始终采用相同的格式,只是不同的数字,其中一个数字将始终为特定ID。
然后我找到了我想要的特定ID,我总是希望在pid%3D
和%26oid
内找到该号码。
$pid = explode("pid%3D", $VC, 2);
$pid = explode("%26oid", $pid[1], 2);
$pid = $pid[0];
在这种情况下,该号码为6057413202557366578
。接下来我想以一种允许我将,"6057413202557366578",[]
之后的所有内容放入变量作为其自己的字符串的方式来爆炸$ VC。
这是事情开始崩溃的地方。我想做的是以下
$vinfo = explode(',"'.$pid.'",[]',$VC,2);
$vinfo = $vinfo[1]; //Everything after the value I used to explode it.
现在我自然而然地环顾四周尝试了其他的东西,比如preg_split和preg_replace,但是我必须承认,它超出了我的范围,据我所知,那些不允许你把你的在它们中间拥有自己的变量(例如',"'.$pid.'",[]'
)。
如果我理解整个正则表达式的想法,可能还有其他问题,如果我在没有$ pid变量的情况下查找它(例如只是周围的字符),它会拾取类似的部分。字符串在到达我想要的字符串之前(例如,"3245697351286309258",[]
)。
我希望我已经对此做了很好的解释,但主要问题是 - 如何将字符串(',"'.$pid.'",[]'
)的特定部分后的信息转换为变量?
答案 0 :(得分:0)
使用捕获组修复捕获超出您想要的问题。您将在括号中包含正则表达式的一部分以捕获它。
您可以使用preg_match_all进行更强大的正则表达式捕获。您将获得一系列包含与匹配整个模式的字符串匹配的内容,以及一个与您使用的每个捕获组的部分匹配的字符串。我们首先捕获您想要的字符串部分。此时没有捕获组:
$text = '<a href="example.com?continue=pid%3D6057413202557366578%26oid283447094297409">Example Link</a>... Lots of other stuff in between here... 80] ,[] ,"","3245697351286309258",[] ,["812750926... and it goes on ...80] ,[] ,"","6057413202557366578",[] ,["103279554... and it continues on"';
$pattern = '/,"\\d+",\\[\\]/';
preg_match_all($pattern,
$text,
$out, PREG_PATTERN_ORDER);
echo $out[0][0]; //echo ,"3245697351286309258",[]
现在只需将pids放入变量中,就可以在模式中添加捕获组。捕获组通过添加括号来完成:
$text = ...
$pattern = '/,"(\\d+)",\\[\\]/'; // the \d+ match will be capture
preg_match_all($pattern,
$text,
$out, PREG_PATTERN_ORDER);
$pids = $out[1];
echo $pids[0]; // echo 3245697351286309258
注意第一个(在这种情况下)捕获组是$ out [1](这是一个数组)。我们捕获的是所有数字。
要捕捉其他一切,假设一切都在方括号之间,你可以匹配更多并捕获它。为了解决这个问题,我们将使用两个捕获组。第一个将捕获数字,第二个将捕获与方括号及其间的所有内容匹配的所有内容:
$text = ...;
$pattern = '/,"(\\d+)",\\[\\] ,(\\[.+?\\])/';
preg_match_all($pattern,
$text,
$out, PREG_PATTERN_ORDER);
$pids = $out[1];
$contents = $out[2];
echo $pids[0] . "=" . $contents[0] ."\n";
echo $pids[1] . "=". $contents[1];
答案 1 :(得分:0)
我希望这能做到你想要的:
pid%3D(?P<id>\d+).*?"(?P=id)",\[\](?P<vinfo>.*?)}\);<\/script>
它捕获组pid%3D
中id
后的数字,以及"id",[]
组中});</script>
之后的所有内容(直到下一次出现vinfo
)。< / p>