2013-07-20 2 views
-1

Я очень новичок в PHP и на этом форуме. Я не знаю, будет ли мой вопрос подходящим для этого форума или нет.PHP Динамическая манипуляция строк

У меня есть строка $filter=([operator] = 'IDEA') AND ([type] = 'R,T'); , но в этой строке есть динамическое значение для значения [типа] , что означает «R, Т» величина [тип] = может быть [типа] = 'R, Т, Р "..........

Теперь содержание каждого символа в [тип] должен быть изменен, как -

([operator] = 'IDEA') AND ([type] ='R' OR [type] = 'T') 

или

([operator] = 'IDEA') AND ([type] ='R' OR [type] = 'T' OR [type] = 'P') 

..... ............. .......

Для этого я написал небольшой код и занимает около 1 дня.

$text = explode("[type] =",$filter); 
$myreplacetext = "[type] = ".$text[1]; 
$text2 = preg_replace('/[^a-zA-Z0-9_ %\[\]\.,]/s', '', $text[1]); 
$string = explode(",", $text2);; 
$i=0; 
foreach($string as $value){ 
    $value = trim($value); 
    if($i==0)$mynewtext = "'".$value."'"; 
    else $mynewtext = $mynewtext." OR [type] = '".$value."'"; 
    $i++; 
} 
$mynewtext = $mynewtext.")"; 
$filter = str_replace($text[1],$mynewtext,$filter); 

Любой, пожалуйста, любезно наставит меня, чтобы написать этот код в простой способ

+2

Вам необходимо написать [рекурсивный парсер спуска] (http://en.wikipedia.org/wiki/Recursive_descent_parser). Это намного сложнее, чем просто разрастание и регулярные выражения. – Barmar

+0

Есть ли конкретный вопрос, на который вы хотели бы ответить? Попросив нас переписать код для вас намного раньше предложения, такого как @ Barmar's, не будет хорошо. – Qix

ответ

1

OK. Попробуйте этот код. Любой вопрос, не стесняйтесь комментировать здесь.

$filter = "([operator] = 'IDEA') AND ([type] = 'R,T,P')"; 
    $text = explode("[type] =",$filter); 
    $firstPart = $text[0]; 
    $text2 = preg_replace('/[^a-zA-Z0-9_ %\[\]\.,]/s', '', $text[1]); 

    // now: 
    // $firstPart sholud be like '([operator] = 'IDEA') AND (' 
    // $text2 should be like 'a,b,c' 
    $string = explode(",", $text2); 
    $typeList = array(); 
    foreach ($string as $value) 
    { 
     $value = trim($value); 
     if (!$value) 
     { 
      continue; 
     } 
     $typeList[] = "[type] = '$value'"; 
    } 
    $typeStr = implode(' OR ', $typeList); 

    // $firstPart sholud be like '([operator] = 'IDEA') AND (' 
    // $typeStr should like: [type] ='R' OR [type] = 'T' OR [type] = 'P' 

    // so the result should be: 
    $filter = $firstPart . $typeStr . ')'; 
    echo $filter; 
    // the output: ([operator] = 'IDEA') AND ([type] = 'R' OR [type] = 'T' OR [type] = 'P') 
+0

Спасибо за помощь – newcomer

Смежные вопросы