|
|
|
| Здравствуйте =))
Чет я никак не могу разобраться с регулярными выражениями....
Знаю, что их нужно знать, штука полезная... В учебнике все про них прочитал... ВСЕ ПОНЯЛ!
Но там все разъяснено на примитивном уровне, а как ток дело касается чего-то посложнее чем дата или доменное имя - ТУПИК =((
Вот не могли бы Вы написать регулярное выражение для конкретного примера, и пояснить, что в нем будет для чего?
Пример такой:
Например EMS-картинка описывается следующей структурой:
ПАРАМЕТРЫ - это 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 >
|
Вот как будет выглядеть регулярное выражение, которое выберет из произвольного текста все теги, соответствующие любому из этих вариантов? И что в нем (выражении) к чему?
И вообще чет я ниче не заметил про перемену мест слагаемых.... Или регулярные, значит РЕГУЛЯРНЫЕ?! =)) | |
|
|
|
|
|
|
|
для: 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,$out, PREG_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>";
}
?>
|
| |
|
|
|
|
|
|
|
для: 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>";
}
?>
|
Все верно? =)) | |
|
|
|
|
|
|
|
для: Sfinks
(28.01.2005 в 23:27)
| | >Все верно? =))
Ага. | |
|
|
|
|
|
|
|
для: 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>";
}
?>
|
| |
|
|
|
|
|
|
|
для: 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 | |
|
|
|