2013-07-11 115 views
0

http://regexr.com?35hk2PHP正則表達式幫助的preg_match

上述網站顯示正確的正則表達式,但是當我用PHP做它,它不顯示某些名稱,如'JJ5x5's White Top Hat'

這裏是PHP:

<?php 
    function newEcho($Value){ 
     echo $Value . "<br>"; 
    }; 
    function cURLAuto($URL){ 
     $Channel = curl_init(); 
     curl_setopt($Channel, CURLOPT_URL, $URL); 
     curl_setopt($Channel, CURLOPT_RETURNTRANSFER, 1); 
     return curl_exec($Channel); 
    }; 
    function autoMatchAll($String,$Pattern){ 
     $Found = array(); 
     $Match = preg_match_all($Pattern,$String,$Found); 
     return $Found; 
    }; 
    function replaceMatch($String,$Pattern,$Subject){ 
     return str_replace($Pattern,$Subject,$String); 
    }; 
    $Count = 0; 
    $Output = cURLAuto("www.roblox.com/catalog/json?Subcategory=2&SortType=0&SortAggregation=3&SortCurrency=0&LegendExpanded=true&Category=2&PageNumber=1"); 
    $AssetId = autoMatchAll($Output,'/"AssetId":[\d]+/'); 
    $Name = autoMatchAll($Output,'/"Name":"[\w\s\d\-' . "\'" . ']+"/'); 
    foreach($AssetId[0] as $Value){ 
     newEcho(replaceMatch($Value,'"AssetId":',"") . ":" . replaceMatch(replaceMatch($Name[0][$Count],'"Name":"',""),'"',"")); 
     $Count++; 
    }; 
    echo $Output 
?> 

$Name是我正在使用正則表達式的問題,因爲它顯示運行代碼時只顯示一些名稱。對於$Name的正則表達式是

/"Name":"[\w\s\d\-\']+"/

但由於我不能使用「或」字符串,我不得不讓

'/"Name":"[\w\s\d\-' . "\'" . "]+/"

但是你可以幫我這個。我想解決這個問題

+0

不需要拆分字符串,你可以使用'\''。此外,'-'屬於課程的開始部分(未轉義)。 –

+0

@WalterTross但是我仍然有問題,因爲一些項目的名字沒有顯示出來!比如JJ5x5的白色禮帽 – wateraura

回答

1

我敢打賭,在JJ5x5's White Top Hat'是 「印刷撇號」,(Unicode的:U+2019 "RIGHT SINGLE QUOTATION MARK"時,Windows代碼頁1252:0x92,UTF-8 PHP:"\xE2\x80\x99")。要從ASCII單引號中指出印刷撇號/引號:如果它直接指向下方(在原始字符串中!),則它是ASCII單引號,如果不是,則爲印刷單引號/引號。

如果你只是想匹配任何東西到用雙引號,使用'/"Name":"[^"]+"/',除非你能逃脫在名稱雙引號,在這種情況下,正則表達式成爲(在PHP)'/"Name":"(?:[^\\\\"]|\\\\[\\\\"])+"/'(添加其他可能逃逸到最後一堂課)。

順便說一句,你不需要將正則表達式的字符串拆分成不同的分隔字符串(所有你必須做的就是轉義當前分隔符),如果你這樣做,你不需要轉義單個在用雙引號分隔的字符串中引用。