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

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

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

 

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

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

тема: Выражение для разбора дополнительных параметров произвольного html тега
 
 автор: Сергей Александрович   (05.04.2007 в 22:22)   письмо автору
 
 

Разбор параметров тега…

Есть вот такие строки….
//$source_str='<tag param1 = value1 param2 = value2 param3 =\’value3 \’ param4 = "value4 ">
//$source_str='tag param1 = value param2 = \'value .. \' param3 ="value .. .."';
//$source_str='<tag param="<...>..." param2=url7 param3=\'...\' param4="4...">';
//$source_str='<tag param=url8 param2="<...>..." >';

как- то нужно их разобрать в массив $ar[param]=’value’;

уже задолбался 4 дня ковыряя эти долбанные выражения !!!
Это вообще реально одним выражением сделать?!&#61514;

ЗАРАНЕЕ БЛАГОДАРЮ ЗА ПОМОЩЬ!

   
 
 автор: Саня   (06.04.2007 в 18:46)   письмо автору
 
   для: Сергей Александрович   (05.04.2007 в 22:22)
 

<?php
//$source_str='<tag param1 = value1 param2 = value2 param3 =\'value3 \' param4 = "value4 ">';
//$source_str='tag param1 = value param2 = \'value .. \' param3 ="value .. .."';
//$source_str='<tag param="<...>..." param2=url7 param3=\'...\' param4="4...">';
$source_str='<tag param=url8 param2="<...>..." >';

if ( 
$source_str[strlen($source_str) - 1] == ">" )
  
$source_str substr($source_str0strlen($source_str) - 1);
$patt "/([A-z\d]+)\s*=\s*('|\")([A-z\d\<>\.\s]+)('|\")/";
preg_match_all($patt$source_str$m1);
preg_replace($patt""$source_str);
preg_match_all("/([A-z\d]+)\s*=\s*([A-z\d\<>\.]+)/"$source_str$m);

$result = array();
if ( 
count($m[0]) !== ) {
  for ( 
$i 0$i count($m[0]); $i++ ) {
    
$result[$m[1][$i]] = $m[2][$i];
  }
}
if ( 
count($m1[0]) !== ) {
  for ( 
$i 0$i count($m1[0]); $i++ ) {
    
$result[$m1[1][$i]] = $m1[3][$i];
  }
}

print_r($result);

   
 
 автор: Сергей Александрович   (08.04.2007 в 02:24)   письмо автору
 
   для: Саня   (06.04.2007 в 18:46)
 

Спасибо, что уделили внимание моей проблеме.
А я все парился, пытался весь разбор одним выражением сделать…, но есть одно, “НО” при таком подходе я пишу: <tag param1=”xxx” param2=zzz param1=yyy>
По идее (по всем законам HTML) должно быть $result[param1]=’yyy’ а не тут то было….:)
параметры В КАВЫЧКАХ подклеиваются после параметров БЕЗ КАВЫЧЕК, и соответственно имеют над ними приоритет. А по идее приоритет должен иметь тот параметр который “позже стоит” в строке…

P.S./ кстати не как не пойму а зачем ЭТО: “preg_replace($patt,"",$source_str);” ???

   
 
 автор: Саня   (08.04.2007 в 17:13)   письмо автору
 
   для: Сергей Александрович   (08.04.2007 в 02:24)
 

Вот, придумал попроще решение. С одним выражением.
<?php
//$source_str='<tag param1 = value1 param2 = value2 param3 =\'value3 \' param4 = "value4 ">';
//$source_str='tag param1 = value param2 = \'value .. \' param3 ="value .. .."';
//$source_str='<tag param1="<...>..." param2=url7 param3=\'...\' param4="4...">';
//$source_str='<tag param=url8 param2="<...>..." >';
$source_str "<tag param1=\"xxx\" param2=zzz param1=yyy>";

$source_str trim($source_str"<>");
preg_match_all("/([a-z\d]+)\s*=\s*('[^']*'|\"[^\"]*\"|[a-z\d\.<>]+)/i"$source_str$m);
for ( 
$i 0$result = array(); $i count($m[0]); $i++ ) {
  switch(
$m[2][$i][0]) {
    case 
"'"$val trim($m[2][$i], "'"); break;
    case 
'"'$val trim($m[2][$i], '"'); break;
    default : 
$val $m[2][$i];
  }
  
$result[$m[1][$i]] = $val;
}
print_r($result);

> P.S./ кстати не как не пойму а зачем ЭТО: “preg_replace($patt,"",$source_str);” ???
Не обращайте внимания. Там ещё много плохих мест.

   
 
 автор: Сергей Александрович   (08.04.2007 в 23:58)   письмо автору
 
   для: Саня   (08.04.2007 в 17:13)
 

Да мне до таких свежих мыслей наверно еще далеко :) ) )

ОГРОМНОЕ СПАСИБО!

P.s/ А о каких "плохих местах" идет речь..(какие тут подводные камни?:),?
Я в этом коде не чего плохого не увидел все вроде просто локонично и логично!:) ,

а preg_replace о котором я спрашивал выше в приведенном вами ранее коде (я так понимаю должен был вырезать все параметры "с кавычками" и отдать второму preg_match_all только те что без ковычек:) но у меня на локале этот preg_replace почемуто вообще не чего неменял в исходной строке (отдавал то же что и пришло)... еще раз спасибо!

   
 
 автор: Саня   (09.04.2007 в 00:30)   письмо автору
 
   для: Сергей Александрович   (08.04.2007 в 23:58)
 

> P.s/ А о каких "плохих местах" идет речь..(какие тут подводные камни?:),?
Ну например первый паттерн неправильно распарсит такой пример:
param = "some value 'in quotes' "

> а preg_replace о котором я спрашивал выше в приведенном вами ранее коде...
Был какой-то частный пример, который неправильно парсился, если не уничтожать параметры в кавычках.

Да и в целом некрасивость предыдущего примера сподвигла меня придумать что-нибудь другое, а не нагромождать кучу условий для отловки всяких частностей. Вот второй вариант мне нравится гораздо больше.

   
 
 автор: Сергей Александрович   (09.04.2007 в 22:33)   письмо автору
 
   для: Саня   (09.04.2007 в 00:30)
 

Еще раз спасибо!:)))

   
Rambler's Top100
вверх

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