Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Парсер строки
 
 автор: *ast*   (21.01.2007 в 10:16)   письмо автору
 
 

ЗДравствуйте. Столкнулся с такой проблемой. Есть строка вида par1="asd" par2="qwe" par3="qweqw". Но это только пример, т.к. в реальной ситуации есть 3 типа этой строки, а фун-ия для неё должна быть одной и той же. Ну так вот. Нужно, чтобы после парсинга образовался массив $massiv вида
par1->asd
par2->qwe
par3->qweqw


З.Ы. Не торопитесь предлагать рег. выражения, т.к. точные названия параметров меняються.

Пример:

id="16788361.1" name="b2-k6" txt="Butterfly knife" massa="30" st="G,H" section="0" damage="S2-6" shot="1-2" quality="125" maxquality="125" nskill="0" OD="1" type="1.13"

id="11485650304.1" name="ba13-b10" txt="Vendetta jackboots" massa="320" st="B" min="dex=40,pow=50,str=40,int=50,intel=15,level=13,man!0" up="dex=19,pow=5,int=-5,str=14" section="0" protect="S26-60,E32-47,O10-20,B20-40,D10-15,P10-20,N15-30,Z5-10,H10-15" quality="900" maxquality="900" build_in="300.4" OD="55" type="0.1"

   
 
 автор: *ast*   (21.01.2007 в 10:17)   письмо автору
 
   для: *ast*   (21.01.2007 в 10:16)
 

Да... ещё... в примере перенос строки не учитывать ;-) случайно скопировал... тоесть фсё идёт одной строкой)))

   
 
 автор: Trianon   (21.01.2007 в 10:38)   письмо автору
 
   для: *ast*   (21.01.2007 в 10:17)
 

Какие символы могут входить в имя?
Регулярное выражение, соответствующее такой записи может выглядеть примерно так:
/([0-9a-zA-Z_]+)=["]([^"]+)["][\s]*/

   
 
 автор: Pit0n   (21.01.2007 в 10:52)   письмо автору
 
   для: *ast*   (21.01.2007 в 10:17)
 

Предлагаю так, если строка будет более или менее постоянна и между переменными будут пробелы:

// Дана строка для парсинга
    $str = "id='16788361.1' name='b2-k6' txt='Butterfly knife' massa='30' st='G,H' section='0' damage='S2-6' shot='1-2' 
            quality='125' maxquality='125' nskill='0' OD='1' type='1.13'";
    
    // Меняем в строке между каждыми переменными знак пробел на "%"
    $str = str_replace(' ','%', $str);
    
    //Затем разбиваем строку на массив из строк с разделителем "%"
    $array_str = explode("%", $str);
    
    // И вывод
    for($i = 0; $i <= count($array_str); $i++)
        {
            echo "<br>".$array_str[$i];
        }


И произвести замену и вставку нужных данных : id,name ,txt и т.д. в соответствующие строки массива

   
 
 автор: *ast*   (21.01.2007 в 10:58)   письмо автору
 
   для: Pit0n   (21.01.2007 в 10:52)
 

сначала я сделал точна так же ;-) но потом получилась проблема... ты неучел пример, где в КОВЫЧКАХ могут быть пробелы ;-) и уже не получаецо.

   
 
 автор: Pit0n   (21.01.2007 в 11:07)   письмо автору
 
   для: *ast*   (21.01.2007 в 10:58)
 

А если произвести замену не пробела на %, а так: <' > на <'%> т.е. менять не только пробел на % но и символ кавычки перед пробелом на кавычку с процентом. Тогда вероятность зацепить лишний пробел уменьшается, но не поможет если в начале значения будет пробел.

   
 
 автор: Pit0n   (21.01.2007 в 11:10)   письмо автору
 
   для: *ast*   (21.01.2007 в 10:58)
 

Ивот что еще точно поможет: нужно задать, чтоб не менялись пробелы перед которыми стоят такие данные : " =" " Т.е. 1. знак равно, 2. кавычка, 3. пробел. Тогда при замене не будут затронуты первая кавычка и пробел, а только последняя кавычка и пробел.

   
 
 автор: chelezo   (21.01.2007 в 11:10)   письмо автору
 
   для: Pit0n   (21.01.2007 в 10:52)
 

ничего неполучаеться ((

   
 
 автор: *ast*   (21.01.2007 в 11:44)   письмо автору
 
   для: *ast*   (21.01.2007 в 10:16)
 

ДА)) ЕСТЬ)) Я СДЕЛАЛ ЭТО)))) вот кому нада...


<?php
$f
=file('design.xml');
for (
$i=0$i<count($f); $i++) {
    
$fe=ereg_replace('<O ','',$f[$i]);
    
$fe=ereg_replace('/>','',$fe);
    
$fe=ereg_replace('" ','%',$fe);
    
$fe=ereg_replace('="','=',$fe);
    
$ar=split('%',$fe);
    for (
$x=0$x<count($ar); $x++) {
    
$tek=split('=',$ar[$x],2);
    if (!
$tek[0]=='') { $item["$tek[0]"]=ereg_replace('"','',$tek[1]);  }
 }
     
//print_r($item); echo "<br><hr>\n";
     
$items["$item[txt]"]=$item;
}
print_r ($items);
?>



а вот файл design.xml:


<O id="16788361.1" name="b2-k6" txt="Butterfly knife" massa="30" st="G,H" section="0" damage="S2-6" shot="1-2" quality="125" maxquality="125" nskill="0" OD="1" type="1.13"/>
<O id="16788363.1" name="b1-g1" txt="FireFly knife" massa="6" st="G,H" min="int=8" section="0" damage="S3-8" count="50" shot="7-3" nskill="4" OD="1" type="1.1"/>
<O id="16788369.1" name="b2-k1" txt="Jackal knife" massa="40" st="G,H" min="level=3" section="0" damage="S5-9" shot="1-4" quality="250" maxquality="250" nskill="0" OD="1" type="1.16"/>
<O id="16788371.1" name="b2-k2" txt="Eviscerator knife" massa="48" st="G,H" min="str=8,level=4" section="0" damage="S8-13" shot="1-5" quality="300" maxquality="300" nskill="0" build_in="315.1" OD="1" type="1.1"/>
<O id="16788373.1" name="b2-k3" txt="Viper knife" massa="40" st="G,H" min="level=4,int=8" section="0" damage="S7-12" shot="1-5" quality="250" maxquality="250" nskill="0" build_in="315.1" OD="1" type="1.17"/>
<O id="16788375.1" name="b2-k7" txt="Rambo knife" massa="55" st="G,H" min="level=5,str=10,dex=8" section="0" damage="S9-13" shot="1-6" quality="300" maxquality="300" nskill="0" OD="2" type="1.97"/>
<O id="16788377.1" name="b2-k4" txt="War knife" massa="60" st="G,H" min="level=5,str=12,dex=10,sk0=15" section="0" damage="S10-18" shot="1-6" quality="400" maxquality="400" nskill="0" build_in="315.3" OD="2" type="1.97"/>
<O id="16788379.1" name="b3-k2" txt="Machete" massa="90" st="GH" min="str=14,dex=10,sk0=12" up="int=-1" section="0" damage="S10-25" shot="1-9" quality="350" maxquality="350" nskill="0" build_in="315.2" OD="2" type="1.99"/>
<O id="16788381.1" name="b3-k1" txt="Vakidsasi" massa="90" st="GH" min="dex=12,int=9,sk0=25" up="str=-2" section="0" cost2="0" damage="S12-36" shot="1-10" quality="400" maxquality="400" nskill="0" build_in="315.3" OD="2" type="1.99"/>
<O id="16788383.1" name="b4-k1" txt="Energy blade" massa="40" st="G,H" min="intel=1,sk0=8" section="0" damage="E6-11,B1-1" shot="1-6" quality="250" maxquality="250" nskill="0" OD="1" type="1.16"/>
<O id="16788385.1" name="b4-k2" txt="Plasma blade" massa="50" st="G,H" min="intel=2,sk0=15,int=20" section="0" damage="E8-14,B1-3" shot="1-7" quality="300" maxquality="300" nskill="0" build_in="315.2" OD="2" type="1.16"/>


точне это его кусок ;-)

   
 
 автор: kasmanaft   (21.01.2007 в 16:06)   письмо автору
 
   для: *ast*   (21.01.2007 в 11:44)
 

Маленький совет: не используйте рег. выражения там, где можно обойтись строковыми функциями.
Тем более в таких количествах (да еще и в цикле)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования