PHP正则表达式帮助preg_match

时间:2013-07-11 07:47:07

标签: php regex preg-match

http://regexr.com?35hk2

上面的网站显示了正确的正则表达式,但是当我使用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\-' . "\'" . "]+/"

但是你可以帮我解决这个问题,因为我想解决这个问题。

2 个答案:

答案 0 :(得分:1)

我敢打赌,'中的JJ5x5's White Top Hat是“印刷撇号”,(Unicode:U+2019 "RIGHT SINGLE QUOTATION MARK",Windows代码页1252:0x92, PHP中的UTF-8:"\xE2\x80\x99")。从ASCII单引号中告诉印刷撇号/引用:如果它直接指向(在原始字符串中!),它是ASCII单引号,如果不是,则为印刷撇号/引号。

如果您只想匹配截止的双引号,请使用'/"Name":"[^"]+"/',除非您可以在名称中使用双引号转义,在这种情况下,正则表达式变为(在PHP中)'/"Name":"(?:[^\\\\"]|\\\\[\\\\"])+"/' (将其他可能的转义添加到最后一个类中。)

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

答案 1 :(得分:0)

试试这个:

'/"Name":"(.*?)"/'