preg_match,addslashes,mb_substr不适用于长字符串

时间:2013-04-17 20:37:22

标签: php preg-match multiline addslashes

我正在解析一个html文件。我有一个大字符串,基本上是一个脚本。 字符串看起来像这样:

  

var spConfig = new   Product.Config({ “outofstock”:[ “12663”], “的inStock”:[ “12654”, “12655”, “12656”, “12657”, “12658”, “12659”, “12660”,“12661 “ ”12662“, ”12664“, ”12665“], ”属性“:{ ”698“:{ ”ID“: ”698“, ”代码“: ”aubade_import_colorcode“, ”标签“: ”的ColorCode“,”选项 “:[{” ID “:” 650" , “标签”: “腮红”, “价格”: “0”, “产品”: “12654”, “12655”, “12656”, “12657”, “12658”, “12659”, “12660”, “12661”, “12662”, “12663”, “12664”, “12665”]}]}, “689”:{ “ID”: “689”,”代码 “:” aubade_import_size_width “ ”标签“:” 大小   宽度”, “选项”:[{ “ID”: “449”, “标签”: “85”, “价格”: “0”, “产品”: “12654”, “12657”, “12660”, “12663”]},{ “ID”: “450”, “标签”: “90”, “价格”: “0”, “产品”:[ “12655”, “12658”, “12661”,“12664 “]},{” ID “:” 451" , “标签”: “95”, “价格”: “0”, “产品”:[ “12656”, “12659”, “12662”, “12665”] }]}, “702”:{ “ID”: “702”, “代码”: “aubade_import_size_cup”, “标签”:“尺寸   杯”, “选项”:[{ “ID”: “1501”, “标签”: “A”, “价格”: “0”, “产品”: “12654”, “12655”, “12656”] },{ “ID”: “1502”, “标签”: “B”, “价格”: “0”, “产品”:[ “12657”, “12658”, “12659”]},{ “ID” : “1503”, “标签”: “C”, “价格”: “0”, “产品”:[ “12660”, “12661”, “12662”]},{ “ID”: “1504”,”标签 “:” d”, “价格”: “0”, “产品”:[ “12663”, “12664”, “12665”]}]}}, “模板”: “\ u20ac#{价格}”, “basePrice”: “57”, “oldPrice”: “57”, “productId参数”: “12666”, “chooseText”:“选择   选项... “” taxConfig “:{” includeTax “:真实的,” showIncludeTax “:真实的,” showBothPrices “:假的,” defaultTax “:19.6,” currentTax “:19.6,” inclTaxTitle “:” 已包含。   税”}});           var colorarray = new Array();

              colorarray["c650"] = 'blush';

    Event.observe('attribute698', 'change', function() {

      var colorId = $('attribute698').value;
      var attribute = 'attribute698';
      var label = colorarray["c"+colorId];

      if ($('attribute698').value != '') {
          setImages(attribute, colorId, label);
        }
    }); //        var currentColorLabel = 'blush'; //        var currentSku = '5010-4-n'; //        var currentPosition = 'v'; // //   
     

Event.observe(window,'load',function(){//
    setImages('attribute698',null,currentColorLabel); //});

我需要从第一个“(”到第一个“;”)中提取内容。 我试过做字符串提取和失败。我尝试过preg匹配我失败了。 请告诉我一些我的问题的解决方案。以下是我尝试过的解决方案和问题。

$strScript =  $tagscript->item(0)->nodeValue;
//this line returns empty string
$str_slashed = addslashes(trim($strScript) );   
$pattern = '/\((.*);/';
preg_match($pattern,$str_slashed,$matches);
echo 'matches'."<br />";
var_dump($matches);

//Add slashes works only if I use it before assignment to other string
$matches = array();
$strScript = addslashes ($tagscript->item(0)->nodeValue);//. "<br />";
$pattern = '/\((.*);/';
preg_match($pattern,$strScript,$matches);
echo 'matches'."<br />";
var_dump($matches);

//str extract method
$posBracket = stripos ($strScript,'(');
 echo $posBracket."<br />";
$posSemiColon = strpos ($strScript,';');
 echo $posSemiColon."<br />";
$temp = mb_substr ($strScript,$posBracket ,($posSemiColon-$posBracket));
echo $temp."<br />";

以上代码适用于小字符串

$strScript = "manisha( [is goo girl] {come(will miss u) \and \"play} ; lets go home;";

但不适用于长串。 我该如何解决这个问题?请帮助我!

2 个答案:

答案 0 :(得分:1)

您必须在正则表达式中添加多行切换。 试试$pattern = '/\((.*);/s';$pattern = '/\((.*);/m';

答案 1 :(得分:0)

尝试使用/\(([^;]*)/作为模式。 [^;]表示任何不是;的字符。

编辑:也按照rogers的建议开启多线模式;因此整个模式应该看起来像/\(([^;]*)/s

编辑:你应该知道,这不是真正的防错。比如说,你会在你的字符串中包含JSON表示的对象的某个属性中得到;