我需要找到一种方法来爆炸其中包含引号的特定字符串

时间:2014-10-05 13:03:00

标签: php regex preg-replace explode preg-split

我遇到了这方面的严重问题,而且我没有足够的经验来理解我应该怎么做。

首先,我有一个很长的字符串,叫做$ 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.'",[]')的特定部分后的信息转换为变量?

2 个答案:

答案 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%3Did后的数字,以及"id",[]组中});</script>之后的所有内容(直到下一次出现vinfo)。< / p>

Here's a demo with shortened text.