2014-10-05 20 views
0

我遇到了嚴重的麻煩,我沒有足夠的經驗去理解我應該如何去做。我需要找到一種方法爆炸一個特定的字符串,其中有引號

要開始我有一個很長的字符串稱爲$ VC。每一次都略有不同,但總是會有一些相同的東西。 $VChtmlspecialchars()字符串,它看起來像

<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

我不知道如果我理解正確的,但[這](http://regex101.com/r/vO5kS5/1)你想要什麼?它捕獲指定組「id」中的ID以及組「2」中的「id」,[]'後面的所有文本。 – 2014-10-05 13:26:23

+0

@Rawing嗯我認爲這似乎是正確的,但它不適用於實際代碼。 [Here's](http://regex101.com/r/eL1rJ6/2)它與我正在使用的實際類型的字符串的外觀如何。呃其實我覺得這個字符串對於這個網站來說太長了,這裏是一個[pastebin](http://pastebin.com/qZJaG7yi)。 – Zei 2014-10-05 13:40:54

+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",[] 

我們得到公正的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 

通知所述第一(且僅在這種情況下)捕獲組是在$出[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]; 
+0

謝謝,我學到了很多正則表達式的工作原理! – Zei 2014-10-05 15:26:00