2013-07-11 226 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":"(?:[^\\\\"]|\\\\[\\\\"])+"/'(添加其他可能逃逸到最后一堂课)。

顺便说一句,你不需要将正则表达式的字符串拆分成不同的分隔字符串(所有你必须做的就是转义当前分隔符),如果你这样做,你不需要转义单个在用双引号分隔的字符串中引用。