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

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

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

 

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

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

тема: РЕгулярные ВЫражения или "Мдасссс...."
 
 автор: Sfinks   (28.01.2005 в 07:38)   письмо автору
 
 

Здравствуйте =))

Чет я никак не могу разобраться с регулярными выражениями....
Знаю, что их нужно знать, штука полезная... В учебнике все про них прочитал... ВСЕ ПОНЯЛ!
Но там все разъяснено на примитивном уровне, а как ток дело касается чего-то посложнее чем дата или доменное имя - ТУПИК =((
Вот не могли бы Вы написать регулярное выражение для конкретного примера, и пояснить, что в нем будет для чего?
Пример такой:

Например EMS-картинка описывается следующей структурой:
<ems:picture ПАРАМЕТРЫ>

ПАРАМЕТРЫ - это width, height и hex, соответственно десятичные ширина и высота, и код картинки 16-ричной строкой.
Параметры могут указываться в любом порядке и записываться как в кавычках, так и без них.
Пробелы (их количество) и регистр букв не играют никакой роли.
Получается все следующие теги идентичны:
<ems:picture width="8" height="8" hex="0123456789ABCDEF">
<ems:picture hex="0123456789ABCDEF" width="8" height="8">
<ems:picture width=8 height=8 hex=0123456789ABCDEF>
<ems:picture width=8 hex=0123456789ABCDEF height=8>
< EMS: PICTURE WIDTH= 8 HEIGHT= "8" hex= "0123456789abcdef" >
< EMS: picture HEIGHT= 8 HEX=0123456789ABCDEF WIDTH= 8 >

Вот как будет выглядеть регулярное выражение, которое выберет из произвольного текста все теги, соответствующие любому из этих вариантов? И что в нем (выражении) к чему?

И вообще чет я ниче не заметил про перемену мест слагаемых.... Или регулярные, значит РЕГУЛЯРНЫЕ?! =))

   
 
 автор: cheops   (28.01.2005 в 13:36)   письмо автору
 
   для: Sfinks   (28.01.2005 в 07:38)
 

Можно составить одно регулярное выражение, но оно будет очень сложным и без ошибок вряд ли получится, это всё равно, что написать форум в одном файле. Здесь обычно прибегают к последовательному вырезанию нужных частей. Сначала вырезают всё что находится между <ems:picture и > а потом в нём ищут нужные параметры, вот скрипт решающий поставленную задачу:
<?php
  
// Текст
  
$text '<ems:picture width="8" height="8" hex="0123456789ABCDEF"> 
  <ems:picture hex="0123456789ABCDEF" width="8" height="8"> 
  <ems:picture width=8 height=8 hex=0123456789ABCDEF> 
  <ems:picture width=8 hex=0123456789ABCDEF height=8> 
  < EMS: PICTURE WIDTH= 8 HEIGHT= "8" hex= "0123456789abcdef" > 
  < EMS: picture HEIGHT= 8 HEX=0123456789ABCDEF WIDTH= 8 >'
;
  
// Шаблон
  
$patern "|<[\s]*ems[\s]*:[\s]*picture([^>]*)|i";
  
preg_match_all($patern$text,$outPREG_SET_ORDER);
  for(
$i=0$i<count($out); $i++)
  {
    
$patern "#height[\s]*=[\s]*\"([^\"]*)\"|height[\s]*=[\s]*([^ ]*)#i";
    
preg_match($patern$out[$i][1], $height);
    
$patern "#width[\s]*=[\s]*\"([^\"]*)\"|width[\s]*=[\s]*([^ ]*)#i";
    
preg_match($patern$out[$i][1], $width);
    
$patern "#hex[\s]*=[\s]*\"([^\"]*)\"|hex[\s]*=[\s]*([^ ]*)#i";
    
preg_match($patern$out[$i][1], $hex);
    if(empty(
$hex[1])) $hexout $hex[2];
    else 
$hexout $hex[1];
    if(empty(
$width[1])) $widthout $width[2];
    else 
$widthout $width[1];
    if(empty(
$height[1])) $heightout $height[2];
    else 
$heightout $height[1];
    echo 
$hexout."<br>";
    echo 
$widthout."<br>";
    echo 
$heightout."<br><br>";
  }
?>

   
 
 автор: Sfinks   (28.01.2005 в 23:27)   письмо автору
 
   для: cheops   (28.01.2005 в 13:36)
 

Если я все понял верно, значит упростил этот код я правильно... Результат вроде не меняется:
<?php 
  
// Текст 
  
$text '<ems:picture width="8" height="8" hex="0123456789ABCDEF"> 
  <ems:picture hex="0123456789ABCDEF" width="8" height="8"> 
  <ems:picture width=8 height=8 hex=0123456789ABCDEF> 
  <ems:picture width=8 hex=0123456789ABCDEF height=8> 
  < EMS: PICTURE WIDTH= 8 HEIGHT= "8" hex= "0123456789abcdef" > 
  < EMS: picture HEIGHT= 8 HEX=0123456789ABCDEF WIDTH= 8 >'

  
// Шаблон 
  
$patern "|<[\s]*ems[\s]*:[\s]*picture([^>]*)|i"
  
preg_match_all($patern$text$out); 
  for(
$i=0$i count($out[1]); $i++) 
  { 
    
$patern '#height[\s]*=[\s]*\"?([0-9]*)#i';
    
preg_match($patern$out[1][$i], $height);
    
$patern '#width[\s]*=[\s]*\"?([0-9]*)#i';
    
preg_match($patern$out[1][$i], $width);
    
$patern '#hex[\s]*=[\s]*\"?([0-9a-f]*)#i';
    
preg_match($patern$out[1][$i], $hex);
    echo 
$hex[1]."<br>";
    echo 
$width[1]."<br>";
    echo 
$height[1]."<br><br>";
  } 
?>

Все верно? =))

   
 
 автор: cheops   (28.01.2005 в 23:41)   письмо автору
 
   для: Sfinks   (28.01.2005 в 23:27)
 

>Все верно? =))
Ага.

   
 
 автор: Sfinks   (29.01.2005 в 06:02)   письмо автору
 
   для: Sfinks   (28.01.2005 в 23:27)
 

А еще вопросик... В РВ можно использовать переменные?
Т.е. вот такой вариант будет верен?

<?php 
  $patern 
"|<[\s]*ems[\s]*:[\s]*picture([^>]*)|i"
  
preg_match_all($patern$text$out); 
  for(
$i=0$i count($out[1]); $i++) 
  { 
    
$patern '#height[\s]*=[\s]*\"?([0-9]*)#i'
    
preg_match($patern$out[1][$i], $height); 
    
$patern '#width[\s]*=[\s]*\"?([0-9]*)#i'
    
preg_match($patern$out[1][$i], $width);
    
$count $width[1]*$height[1]/4;
    
$patern '#hex[\s]*=[\s]*\"?([0-9a-f]*)('.$count.')#i'
    
preg_match($patern$out[1][$i], $hex); 
    echo 
$hex[1]."<br>"
    echo 
$width[1]."<br>"
    echo 
$height[1]."<br><br>"
  } 
?> 

   
 
 автор: cheops   (29.01.2005 в 13:55)   письмо автору
 
   для: Sfinks   (29.01.2005 в 06:02)
 

Да можно и нужно, только будте аккарутными при вставке перменной непосредственно в строку:
<?
 
"#hex[\s]*=[\s]*\"?([0-9a-f]*)($count)#i"
?>

в этом случае необходимо использовать двойные кавычки, так как в одинарных строка не интерполируется и вставляется значение "$count".

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=130

   
Rambler's Top100
вверх

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