Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рег. выражение - поиск html тега, Сложный поиск в тегах с помощью рег. выр 
:(
    Опции темы
gorden
Дата 23.1.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет!

Помогите пожалуйста с рег. выражением. Я вытаскиваю содержимое DIVа с помощью innerHTML. В этом содержимом есть такой тег:

Код

<input type="hidden" id="myid" value="myvalue">


Различные браузеры могут его так-же интерпритировать как:

Код

<input id="myid" type="hidden" value="myvalue">


или 

Код

<input value="myvalue" id="myid" type="hidden">


или 

Код

<input value=myvalue id=myid type=hidden>


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

Код

<input value="myvalue" id="myid" type="hidden"/>


Мне нужно с помощью регулярного выражения найти этот тег из полученного содержимого DIVa. 

значение value - может быть буквой или цифрой
значение id - может быть может быть буквой или цифрой или _


У меня на ум приходит только следующее, но это не работает:
Код

var reg = '<input (id=([\'"]?)([_0-9a-zA-Z]?)([\'"]?))|(type=([\'"]?)hidden([\'"]?))|(value=([\'"]?)([0-9a-zA-Z]?)([\'"]?))>';




Буду очень благодарен за любой совет. Спасибо!!!!!!



PM MAIL   Вверх
solenko
Дата 23.1.2008, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 9
Всего: 67



А может проще пробежаться по DOM дереву и найти этот элемент?


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 23.1.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Что только народ не придумает...  smile 
div.getElementsByTagName("input")[0] - оно?


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
ksnk
Дата 23.1.2008, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Sardar, В этом случае, скорее всего, даже getElementById подойдет ;-)...


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


Новичок



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

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



Спасибо, я прекрасно понимаю, что через getElementById это можно сделать. Но в моем случае необходимо сделать именно через рег. выражения, иначе я бы не спрашивал.
PM MAIL   Вверх
Astraller
Дата 23.1.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.8.2007
Где: $Украина[Кры м]->Феодосия

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



gorden, а может вы еще не поленитесь изложить почему? smile


--------------------
A.S.T.R.A.L.L.E.R.: Artificial Synthetic Technician Responsible for Assassination, Logical Learning and Efficient Repair
PM MAIL WWW ICQ   Вверх
gorden
Дата 23.1.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну вот смотрите:

Код

<div id="container" align="center"> 
<a href="http://www.mysite.com/">MySite</a>
<input type="hidden" id="myid" value="myvalue">
<script src="http://www.mysite.com/myscript.js" language="javascript" type="text/javascript"></script>
Text... Text... Text... 

<a href="http://www.mysite2.com/" class="myclass">MySite2</a>
Еще текст
</div>



Этот код, например, будет размещаться на разных сайтах. При этом, подключаемый "myscript.js", берет содержимое DIVa при помощи innerHTML и проверяет, не внесены ли какие-либо ненужные изменения в содержимое DIVa "container". В DIVе могут находится и теги и Текст и все что угодно. Подключаемый скрипт "myscript.js" проверяет это, и если нет ненужных изменений, то выполняет одно действие, а если есть - другое.

Вот мне и нужно это все проверить. Как в этом случае через DOM работать я пока не представляю. У меня пока получается проверить текст, с учетом случайных пробелов и переводов строки, которые допустимы для текста, но теги с более чем одним атрибутом проверить пока не получается.
PM MAIL   Вверх
ksnk
Дата 23.1.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(gorden @  23.1.2008,  16:21 Найти цитируемый пост)
Как в этом случае через DOM работать я пока не представляю.
 В тот момент, когда скрипт "берет содержимое DIVa при помощи innerHTML" этот самый div УЖЕ есть в DOM и его и его содержимое можно проверить самим DOM'ом.

Код

var container=documet.getElementById('container'),
      input=container.getElementById('myid');

if(input.value!='simple value') alert('Спасите, Грабят!!!');      

if(input.onclick) alert('Оппа! Грязный код...');      



Тут есть тонкость - браузеры могут навесить свои собственные атрибуты на тег без разрешения, так что проверять надо только самые "ходовые" smile


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


Новичок



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

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



Цитата

Код

var container=document.getElementById('container'); 
      input=container.getElementById('myid');


Не работает у меня ни в одном браузере такая конструкция. Не выходит этот код на mydiv.


Так тоже не работает:
Код

var container=document.getElementById('container').innerHTML; 
      input=container.getElementById('myid');


Хорошо, если через DOM, хотя в этом случае не проверить содержимое текста, то как тогда правильно обратиться к mydiv, толко не через главный документ: document.getElementById('mydiv') а через 'container'?

И все же если есть мысли по поводу рег. выражений, pls. подскажите.
PM MAIL   Вверх
Sardar
Дата 24.1.2008, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(gorden @  24.1.2008,  16:49 Найти цитируемый пост)
Не работает у меня ни в одном браузере такая конструкция.

Этого не может быть, если только скрипт не пытается исполниться до вёрстки <div id="container...

Цитата(gorden @  24.1.2008,  16:49 Найти цитируемый пост)
Так тоже не работает:

innerHTML - строка, выборок как коллекция не поддерживает. getElementById метод документа, потому как id уникален во всём документе (если вёрстка валидна), следовательно реализовать его для контейнерных элементов не имеет смысла.

Цитата(gorden @  23.1.2008,  12:03 Найти цитируемый пост)
Я вытаскиваю содержимое DIVа с помощью innerHTML.

Вот в этой точке вместо выдёргивания innerHTML поставь div.getElementsByTagName("input") - список всех input'ов внутри div'а. Да, div это твоя переменная, где раньше стоял div.innerHTML...  Да, getElementsByTagName пишеться с s (множественное). Вроде бы больше нигде ошибиться нельзя...

Регами не стоит, это как минимум глупо. Если всё же очень хочется, то не нужно вносить атрибуты в рег, просто захвати все:
Код

((?:(?:[a-zA-Z0-9_]+)\s*=\s*(?:"(?:[^\\"]|\\.)*")|(?:'(?:[^\\"]|\\.)*')|(?:[^\s]*))*)
//да, это общий рег, продублируй все \
//да, это часть отвечает только за аргументы
//да, это писалось на коленке и без тестов :)



P.S. при проблемах, отвечай с ссылкой на страницу, иначе долго гадать будем.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
gorden
Дата 24.1.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Этого не может быть, если только скрипт не пытается исполниться до вёрстки <div id="container...


Никак не пойму. Все равно не работает. Перегрелся я что-ли? Ошибка: container.getElementById is not a function


Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>

<body>


<div id="container">
<input id="myid" type="hidden" value="OK">
<script language="javascript" type="text/javascript">
  function getInputElementValue(){
     var container = document.getElementById("container");
     return container.getElementById("myid").value;
  }
</script>
</div>

<input type="button" value="test" onclick="alert(getInputElementValue())">

</body>
</html>



PM MAIL   Вверх
Sardar
Дата 24.1.2008, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



gorden, повторяю, id - уникальный идентификатор на странице. Уникальный - означает один единственный, второго быть не может, иначе будет ошибка (браузер проигнорирует их множество, выдаст произвольный). Вывод: getElementById не имеет смысла вкладывать вне документа, т.к. иерархии (дерева) быть не может.

Решение: return document.getElementById("myid").value;

В отличии от id, имя тега не уникально (естественно), т.е. можно взять все теги с определённым именем из некоторого контейнера. Для этого метод (любой контейнер или document).getElementsByTagName(name). Возвращает список всех найденных, выбираешь необходимый.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
gorden
Дата 24.1.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я понял теперь. Спасибо. Буду пробовать одновременно и через DOM (для тегов) и через RegEx (для текста внутри контейнера).

THANKS!!!!!!!!!!!!!!
PM MAIL   Вверх
gorden
Дата 28.1.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Снова возвращаюсь к теме, т.к. возникла еще одно проблема. Вот имеем:

Код

var tagDiv = container.getElementsByTagName('div');
var styleContent = tagDiv[0].attributes['style'].value;


В данном случае в контейнере только один DIV. У этого DIVа есть атрибут style со значением. Во всех браузерах кроме IE переменная styleContent получает точное значение атрибута style, а IE почему присваивает ей null.

Подскажите pls. в чем проблема
Спасибо.
PM MAIL   Вверх
Astraller
Дата 28.1.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 300
Регистрация: 1.8.2007
Где: $Украина[Кры м]->Феодосия

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



Можно попробовать:
Код

var styleContent = tagDiv[0].getAttribute('style');

Или просто:
Код

var styleContent = tagDiv[0].style;


У меня, помнится работало и то и другое везде. smile 

Это сообщение отредактировал(а) Astraller - 28.1.2008, 16:24


--------------------
A.S.T.R.A.L.L.E.R.: Artificial Synthetic Technician Responsible for Assassination, Logical Learning and Efficient Repair
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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