我需要找到一种方法来分解一个包含引号的特定字符串


I need to find a way explode a specific string that has quotes in it

我在这方面遇到了严重的问题,我的经验不足,无法理解该如何处理。

首先,我有一个非常长的字符串,称为$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。接下来,我想以一种方式分解$VC,使我可以将,"6057413202557366578",[]之后的所有内容作为自己的字符串放入变量中。

这就是事情开始崩溃的地方。我想做的是以下

$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.'",[]')的特定部分之后的信息获取到变量中?

我希望这能满足你的要求:

pid%3D(?P<id>'d+).*?"(?P=id)",'['](?P<vinfo>.*?)}');<'/script>

它捕获组idpid%3D之后的数字,以及组vinfo"id",[]之后的所有内容(直到});</script>的下一次出现)。

这是一个缩短文本的演示。

捕获超过所需数量的问题已使用捕获组解决。您将把正则表达式的一部分包装在括号中以捕获它

您可以使用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",[]

现在,要将pid放入变量中,可以在模式中添加一个捕获组。捕获组通过添加括号完成:

    $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];