Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярное выражение, по поиску атрибутов тега 
V
    Опции темы
Deja_Vu
Дата 21.11.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.6.2007
Где: Казань

Репутация: нет
Всего: 2



Нужно написать регулярное выражение, которое при использовании в preg_match_all (PHP) выдовало бы все атрибуты и их значения.
Вот то что у меня есть, но что не работает -((

Код

$matches = array();
preg_match_all('/\<block\s+([a-z_]+=[\'"]{1}[^\'^"]+[\'"]{1}\s*?)*?\>/s',
'<block wef="e2f" norv="12asd345" abc="werty">', $matches);
var_dump($matches);


Код

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(45) "<block wef="e2f" norv="12asd345" abc="werty">"
  }
  [1]=>
  array(1) {
    [0]=>
    string(11) "abc="werty""
  }
}

Как видно, я тут получаю, лишь последний атрибут ... -((

P.S.
ПРошу админов переместить топик в http://forum.vingrad.ru/forum/php-text-manipulations.html

Это сообщение отредактировал(а) MoLeX - 24.11.2008, 15:44
PM Skype   Вверх
Deja_Vu
Дата 24.11.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.6.2007
Где: Казань

Репутация: нет
Всего: 2



UP ...
ну что.. никто не может помочь?
Почему такое странное поведение функции? -((

Это сообщение отредактировал(а) MoLeX - 24.11.2008, 15:43
PM Skype   Вверх
ksnk
Дата 24.11.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



preg_match_all отличается от preg_match тем, что циклически "прикладывает" регулярку после первого совпадения, начиная с последнего оставшегося "неотработаным" регуляркой символом. Понятно, что с такой регуляркой может быть только такой и результат. 
Можно состряпать более сложное действие. Сначала регуляркой откусить область имени тега от области параметров, а вот уже потом разобрать параметры другой регуляркой.

Ну, или применить финт ушами
Код

preg_match_all('/<block\W|([a-z_]+=[\'"]{1}[^\'^"]+[\'"]{1})|>/s',
'<block wef="e2f" norv="12asd345" abc="werty">', $matches);





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
unicross
Дата 24.11.2008, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 422
Регистрация: 15.6.2008

Репутация: 5
Всего: 53



Deja_Vu, можно попробовать так
Код

<?php
$str = '<block wef="e2f" norv="12\'asd345" abc=\'wer"ty\' dfg="ghgjhdf gddfdx" hhgsds="12jhgg1245">';
$pattern = '#<([a-z]+?)\s*
(?:([a-z_]+?\s*=\s*(?:(?:"[^"]*?")|(?:\'[^\']*?\')))\s*)?
(?:([a-z_]+?\s*=\s*(?:(?:"[^"]*?")|(?:\'[^\']*?\')))\s*)?
(?:([a-z_]+?\s*=\s*(?:(?:"[^"]*?")|(?:\'[^\']*?\')))\s*)?
(?:([a-z_]+?\s*=\s*(?:(?:"[^"]*?")|(?:\'[^\']*?\')))\s*)?
(?:([a-z_]+?\s*=\s*(?:(?:"[^"]*?")|(?:\'[^\']*?\')))\s*)?
>#six';
preg_match_all($pattern, $str, $arr, PREG_SET_ORDER);
echo '<pre>';
print_r($arr);
echo '</pre>';
?>

Этот скрипт обработает от 0 до 5 атрибутов. Количество можно увеличить за счет увеличения количества строк
Код

(?:([a-z_]+?\s*=\s*(?:(?:"[^"]*?")|(?:\'[^\']*?\')))\s*)?

PM MAIL WWW   Вверх
Deja_Vu
Дата 24.11.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.6.2007
Где: Казань

Репутация: нет
Всего: 2



Нет, дублирование шаблонов для атрибутов, не вариант -((
Ибо их может быть до сотни - легко. 
+ Не красиво это.

Нашли вариант такой, но он опять же не очень удобный
Код

preg_match_all('/\<block[^>]+?name=[\'"]{1}([^>]+?)[\'"]{1}.*?\>|<\/block\>/su',  $sContent, $matches, PREG_OFFSET_CAPTURE);
for ($i=0; $i<count($matches); $i++)
    preg_match_all('/([a-z_]+)=[\'"]{1}(.*?)[\'"]{1}/s', $matches[$i], $attrb);


Ибо две регулярки с циклом. -((((

Добавлено @ 21:36
to ksnk 
Спасибо - шикарное решение!!!!!


В результате получилось так:
Код

preg_match_all('/<block\W|(([a-z_]+)=[\'"]{1}([^\'^"]+)[\'"]{1})|>/s',
'<block wef="e2f" norv="12asd345" abc="werty">', $matches);


Это сообщение отредактировал(а) Deja_Vu - 24.11.2008, 21:40
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.