0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 19
1

Получить значения элементов в регулярном выражении

07.06.2006, 14:25. Показов 6515. Ответов 39
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уже несколько дней бьюсь над такой вот незамысловатой задачкой:
Имеется строка:
<tags></tags><img[пробелы или др. атрибуты]src="dir1/dir2/pic.gif"[пробелы или др. атрибуты]width="500"[пусто,пробелы или др. атрибуты]/><tags></tags>

<tags></tags> - любые другие теги. Атрибут width может стоять до атрибута src.

Требуется получить значения атрибутов width и src тега img. Уже повсякому крутил preg_match_all а что нужно не получается (
ПоможЫте плз, может кто знает как или делал уже.. Заранее thnks.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2006, 14:25
Ответы с готовыми решениями:

Ошибка в регулярном выражении
Здравствуйте, возникла проблема с регулярным выражением. regexp = &quot;|&lt;span&gt;\s+&lt;b&gt;24 октября...

Ошибка в регулярном выражении
Есть текст $text = '1#{\b 37\par К88\par \b0 \b Акулова, З. М. \b0 \par \tab Куда пойти...

Ошибка в регулярном выражении
Составляю регулярное выражение для перевода url из текста, в активную ссылку. $text =...

Парсинг в регулярном выражении
Добрый день. Нужна помощь в регулярном выражении. Как получить содержимое тегов h1, h2 и т.д.?...

39
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
07.06.2006, 15:11 2
Забудь про регулярные выражения и пользуйся функцией strstr. Находишь начала тега img, затем его конец (/>) и уже внутри этого дипазона ищешь атрибут width. Получится длиннее, но на порядок эффективнее.
0
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 19
07.06.2006, 17:16  [ТС] 3
10x. Буду делать без них..

Чтото у меня не красивый кусок получился..
PHP
1
2
3
4
5
6
7
8
$img1=stristr($item,"<img");
$img_end=strpos($img1,'>');
$img=substr($img1,0,$img_end);
 
$url1=stristr($img,"src="");
if (strlen($url1)>5) $url_end=strpos($url1,""",5);
$url_cat=substr($url1,0,$url_end);
list($bad,$url) = explode(""",$url_cat);
это поиск SRC если url в двойных кавычках указано.. Что-то поэффективнее на ум ничего не приходит..
0
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
07.06.2006, 17:34 4
Alladar (07.06.2006)
Чтото у меня не красивый кусок получился..

... [вырезано] ...
Ну и что с того что некрасивый. Если работает, то вынеси его в отдельную функцию и не напрягайся.
0
5 / 5 / 3
Регистрация: 17.10.2007
Сообщений: 1,119
07.06.2006, 19:43 5
Voobsche-to dlya takix veschej ispol'zuyut DOM parser...
0
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
07.06.2006, 20:16 6
VladConn (07.06.2006)
Voobsche-to dlya takix veschej ispol'zuyut DOM parser...


Далеко не всегда. Это называется стрелять из пушки по воробьям. Иной раз проще бывает даже c XML работать как со строкой, а не через DOM модель.
0
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 19
08.06.2006, 13:00  [ТС] 7
На самом то деле я парсю xml теги.. img я ввёл для аналогии и простоты восприятия..
Да лучше было бы использовать DOM, но DOM либра похоже на моём хостинге отсутствует потому как его функции, такие например как xmldoc() отсутствуют.. Делал через xml_parser, но там тоже траблы, - номера ключей массивов одних тегов не совпадают с ключами массивов других тегов.. (некоторые под_теги вложенные в теги-родители могут отсутствовать и нумерация пойдет "не верно" - вместо пустого элемента пропустит пока не получит значение этого тега).
Потому решил парсить регуляркой, тоже "палок" море.. остановился на strstr..

Незнаю понял ли меня кто-нибудь.. </DIV>
0
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 19
08.06.2006, 13:33  [ТС] 8
XML Файл чтоли большой(( Один распарсился с помощью рекурсивной функции с использованием функций strstr substr и strpos.. А второй размером более 80000байт ругается... как быть... (

Allowed memory size of 8388608 bytes exhausted (tried to allocate 88788 bytes) in <B>/script.php</B> on line <B>40</B>



</DIV>
0
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
08.06.2006, 14:18 9
Проверяй свой алгоритм. Возможно у тебя слишком глубокий уровень рекурсии происходит - это ведь тоже память потребляет.



Попробуй уменьшить кол-во строковых операций. К примеру, вот часть твоего кода:



$img1=stristr($item," ');

$img=substr($img1,0,$img_end);



Операцию substr в строке 3 можно и не делать, это занимает лишную память. Работай с диапазоном [$img1 ... $img_end].
0
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 19
08.06.2006, 16:15  [ТС] 10
Эмм.. а как я правый предел вычислю без этой строки с strpos?

Вообще странно.. в переменную $xml пишу файл в 8кбайт и её рекурсивно обрезаю при найденном нужном значении и снова вызываю(уже с обрезком)..

странно, если сделать substr($xml,80000) то ему хватает памяти если всю строку то задыхается этой надписью о размере памяти </DIV>
0
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 19
08.06.2006, 18:30  [ТС] 11
Блин 120кБ теста прорекурсировать не может(( В нечном счёте на strstr ругается ( Может она как-то память своим очередным выховом забивает и не освобождает?..</DIV>
0
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
08.06.2006, 18:35 12
Не видя кода, я ничего конкретного посоветовать не смогу.
0
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 19
08.06.2006, 19:01  [ТС] 13
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function between_array($source,$tag1,$tag2) {
 static $res;
 if ($source) {
    $val1=strstr($source,$tag1); $val1=substr($val1,strlen($tag1));
    $val_end=strpos($val1,$tag2);
    $val=substr($val1,0,$val_end); 
         if ($val) { 
  $source = strstr($source,$tag2);  
  $source=substr($source,strlen($tag2)); 
  $res[]=$val; 
  between_array($source,$tag1,$tag2);   }
  else $source="";
 } 
  return $res;
}
вывод всех найденных значений массивом
Работает до 80кб строки
PHP
1
$items = between_array($filetext,'<tag begin>','<tag end>');
Ругаться в конеч счёте будет на strstr и кричать о памяти
0
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
08.06.2006, 21:12 14
Зачем здесь рекурсия можешь обяснить?
Попробуй вариант попроще:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function between_array($source, $tag1, $tag2)
{
    $res = array();
    $tag1_len = strlen($tag1);
    $tag2_len = strlen($tag2);
 
    for($last = 0;;)
    {
        $pos1 = strpos($source, $tag1, $last);
        if (FALSE === $pos1) break;
 
        $pos2 = strpos($source, $tag2, $pos1+1);
        if (FALSE === $pos2)
        {
            $last = $pos1 + $tag1_len;
        }
        else
        {
            $res[] = substr($source, $pos1+$tag1_len, $pos2-1-$pos1-$tag1_len);
            $last = $pos2 + $tag2_len;
        }
    }
 
    return $res;
}
Я взял тестовый xml файл и сравнил результат работы твоей и своей функции. Они оказались идентичны.
0
0 / 0 / 0
Регистрация: 20.02.2011
Сообщений: 148
09.06.2006, 01:51 15
Ну позвольте я и свои 5 коп вставлю

мне кажется что

PHP
1
2
3
4
5
$img1=stristr($item,"<img");
 
$img_end=strpos($img1,'>');
 
$img=substr($img1,0,$img_end);
Не рационально выципи все строки так

как я понял надо узнать сылку на картинку то это можно сделать так

preg_match_all("/[ ](?:src)[
]*=[ '"
]*([^ "'>
]+)[^>]*>/i", $item, $linc);

$linc=$linc[1];

$linc=array_values(array_unique ($linc));

$linc масив с сылками на картинки c width по тому же принцыпу.
0
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 19
09.06.2006, 11:23  [ТС] 16
pehser (08.06.2006)
Ну позвольте я и свои 5 коп вставлю
мне кажется что
PHP
1
2
3
$img1=stristr($item,"<IMG");
$img_end=strpos($img1,'>');
$img=substr($img1,0,$img_end);
Не рационально выципи все строки так
как я понял надо узнать сылку на картинку то это можно сделать так
preg_match_all("/[ ](?:src)[
]*=[ '"
]*([^ "'>
]+)[^>]*>/i", $item, $linc);
$linc=$linc[1];
$linc=array_values(array_unique ($linc));
$linc масив с сылками на картинки c width по тому же принцыпу.
Сенкс, думаю твой пример мне ещё пригодится. А на сколько его рационально использовать если файл источник килобайт на 200? Тормазить регулярка не будет? А вообще мне нужно было 2 вида парсинга..
<STRONG>1:</STRONG>
<STRONG>...<tagwww>содержимое</tagwww>....<tagwww>содержимое</tagwww>....</STRONG>
Вытащить в массив все значения между тегами <tagwww> и </tagwww>
<STRONG>2: </STRONG>
<STRONG> [tag1, tag2...]...<mytag</STRONG><EM><FONT size=1>[любое мн. символов и пробел]</EM><STRONG>url="dir/pic.gif"</STRONG><FONT size=1><EM>[возможно есть символы]/</EM><FONT size=2><STRONG>>...[tagN,tagM]..</STRONG>
Найти <<STRONG>mytag/> </STRONG>и вытянуть у него значение атр. <STRONG>url</STRONG>

Вот и бьюсь уже который день... если с регуляркой я с 1й задачей справился.. незнаю оптимально или нет, а для больших объемов это важно.. то со второй вообще ничего не получается ( А прогонять по 200-300кб текста с неоптимальной регуляркой както....
<STRONG></STRONG>
<STRONG></STRONG> </DIV></DIV>
0
0 / 0 / 0
Регистрация: 23.06.2011
Сообщений: 19
09.06.2006, 11:28  [ТС] 17
Попробуй вариант попроще:
Счас и твой вариант попробую, ну да можно было и без рекурсий обойтись-привычка.. сам себе проблеммы создаю)
0
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
09.06.2006, 14:15 18
2 Alladar

Просто для информации тебе. Проверил сегодня свою функцию на файле размером в 900 Кб - проглотила без проблем.



2 pehser

Следует понимать, что регулярные выражения имееют как достоинства так и недостатки. Достоинство это возможность просто описать некий шаблон текста, а недостаток что это требует больше ресурсов по сравнению с обычными строковыми функциями. Поэтому не надо воспринимать регулярные выражения как "серебрянную пулю" и применять их с умом, а не пихать куда попало.



В данном конкретном случае для поиска атрибута src лучше написать специальную функцию, чем регулярное выражение. Да, эта функция будет длинее, чем вариант с регулярными выражениями, но работать он будет быстрее.
0
0 / 0 / 0
Регистрация: 20.02.2011
Сообщений: 148
09.06.2006, 15:17 19
bazile, я регулярки не воспринимаю как ... я кодато сам писал скрипт который должен вы циплять все сылки на страничке или все картинки на страничке и может я тогда не правильно функцию на писал но регулярка выигрывала по скоросте.

Надо будет по баловаться, аж интересно стало.
0
0 / 0 / 0
Регистрация: 20.02.2011
Сообщений: 148
09.06.2006, 15:23 20
Alladar (09.06.2006)


<STRONG>2: </STRONG>
<STRONG>[tag1, tag2...]...<mytag</STRONG><EM><FONT size=1>[любое мн. символови пробел]</EM><STRONG>url="dir/pic.gif"</STRONG><FONT size=1><EM>[возможно есть символы]/</EM><FONT size=2><STRONG>>...[tagN,tagM]..</STRONG>
Найти <<STRONG>mytag/></STRONG>и вытянуть у него значение атр.<STRONG>url</STRONG>

Вот ибьюсь уже который день... если срегуляркой я с 1й задачей справился.. незнаю оптимально или нет, а для больших объемов это важно.. то со второй вообще ничего не получается ( А прогонять по 200-300кб текста с неоптимальной регуляркой както....
<STRONG></STRONG>
<STRONG></STRONG></DIV></DIV>
ну втрой вариант если же через регулярки то так

preg_match_all("/<mytag(?:url)[
]*=[ '"
]*([^ "'>
]+)[^>]*>/i", $item, $linc);
0
09.06.2006, 15:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2006, 15:23
Помогаю со студенческими работами здесь

Ошибка в регулярном выражении
Приветствую!! Помогите найти ошибку:...

Ошибка в регулярном выражении
Доброго времени суток. В чем может быть ошибка: Warning: preg_match_all(): Compilation failed:...

Спец символы в регулярном выражении
Парни подскажите такую вещь . Вот есть вражение 'arts/(+)/(+)' =&gt;'arts/view/$1/$2' , вторая маска...

Проверка поля с паролем на регулярном выражении
Добрый вечер! У меня такая проблема при регистрации у меня пропускает скрипт поля с заглавными...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru