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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с preg_match, Не срабатывает регулярка. Помогите 
V
    Опции темы
tolik777
Дата 18.9.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть HTML:
Код

<form name="quick_find" action="http://domain.ru/advanced_search_result.php" method="get">
<input type="hidden" name="search_in_description" value="1">
<input type="hidden" name="ref" value="4">    
  <table width="130"  border="0" cellspacing="0" cellpadding="0" style="border-style:solid; border-color:#378743; border-width:1" >
    <tr bgcolor="#E5F9DA">
      <td width="50%" valign="middle">
        <div align="right" style="padding-right:5; padding-left:10">
          <input name="keywords" maxlength="30" type="text" style="border-color:#378743; border-width:1; border-style:solid">
        </div>
      </td>
      <td width="50%" height="48">
      <div align="left" valign="center" style="padding-right:10; padding-left:5">
      </div>
    </td>
    </tr>
    <tr bgcolor="#E5F9DA">
      <td height="100%" colspan="2" style="padding-right:10; padding-left:10; padding-bottom:5">
        <div style="font-size: 10">
        <a href="http://domain.ru/index.php?cPath=28&ref=4" class="link_box">бла бла бла</a>, <a href="http://domain.ru/index.php?cPath=29&ref=4" class="link_box">ля лял я</a>, 
      </div>
    </td>
    </tr>
  </table>
</form>



Нужно найти совпадение в нем по 2-м тэгам: <form name="quick_find" action="http://domain.ru/advanced_search_result.php" method="get"> и <a href="http://domain.ru/index.php?cPath=28&ref=4" class="link_box">бла бла бла</a>. Если они есть, то регулярка должна срабатывать.

Мой код:
Код

$regexp = '|<form(\s*)name="(\w*)"(\s*)action="http:\/\/domain\.ru\/advanced_search_result\.php"(\s*)method="get">[^<\/form]*
         <a|x';
$test_link = preg_match($regexp,$File,$matches);
for($i=0; $i < count($matches); $i++){
    echo $matches[$i];
}
echo '<BR>'.$test_link;


Это сообщение отредактировал(а) tolik777 - 18.9.2006, 19:16
PM MAIL WWW ICQ   Вверх
skyboy
Дата 18.9.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



что за странное отделение при помощи символов "|"?
PM MAIL   Вверх
jzZ
Дата 18.9.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Насколько я знаю тут: form(\s*)
надо писать так form(\s)* корчое * за скобкой
PM MAIL   Вверх
skyboy
Дата 18.9.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



кста, 
Цитата

[^<\/form]

означает не "только не </form", а "только не '<','\','f','o','r','m'", то есть закончится на первой же букве "f", "o", "r" или "m", которые встречаются ещё до ссылки

Добавлено @ 18:59 
Цитата(jzZ @  18.9.2006,  17:48 Найти цитируемый пост)
надо писать так form(\s)*

как я понимаю, квантификатор повторения применяется либо к группе(при выделении в скобки), либо к последнему символу(или псевдосимволу, аки "\s"). 
PM MAIL   Вверх
tolik777
Дата 18.9.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как тогда [^<\/form] правильно записать? Так [^(<\/form)] ?
Попробовал, все равно не рабоает.


Цитата

Насколько я знаю тут: form(\s*)
надо писать так form(\s)* корчое * за скобкой 

Мне начало формы не нужно. Тут все работает. Мне надо идти от <form.......>, далее до закрывающего тэга формы </form> и между этими тэгами проверить есть ссылка <a href ......., и все что между этими тэгами находиться пропустить, т.е. проверку не делать, там может быть какой-угодно html код.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 18.9.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



давай ты скажешь, по каким признакам информацию собираешься искать, а? А то по твоей регулярке сильно не определишь, чего тебе надобно... то, что ищешь содержимое ссылки внутри формы это я понял. а подробнее? одна это ссылка или нет? по чём её определяешь(если не одна она такая)? по адресу? по классу?
PM MAIL   Вверх
tolik777
Дата 19.9.2006, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вообщем задача такая проверить, был ли установлена форма на определенной странице. Форма включает в себя форму поиска и снизу ссылки.
Чтобы всю форму не проверять, мне достаточно проверить:
1. <form name="quick_find" action="http://domain.ru/advanced_search_result.php" method="get">
2. </form>
3. Внутри этой формы обязательно должна быть хотя бы одна ссылка <a href="http://domain.ru/index.php?cPath=28&ref=4" class="link_box">бла бла бла</a>
Вот и все.
Первый пункт я сделал, а вот дальше не могу сдвинуться.
PM MAIL WWW ICQ   Вверх
skyboy
Дата 19.9.2006, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



Код

/<form.*<a.*class="link_box".*\/form>/

проверяем наличие в форме ссылки с классом link_box.
PM MAIL   Вверх
tolik777
Дата 19.9.2006, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

$regexp = '/<form.*<a.*class="link_box".*\/form>/x';
$test_link = preg_match($regexp,$File,$matches);
for($i=0; $i < count($matches); $i++){
    echo $matches[$i];
}
echo '<BR>'.$test_link;

В $test_link также 0. Не срабатывает.

Добавлено @ 09:01 
Все. Наконец разобрался. Вот так надо:
Код

$regexp = '/<form.*<a.*class="link_box".*\/form>/xs';
$test_link = preg_match($regexp,$File,$matches);
for($i=0; $i < count($matches); $i++){
    echo $matches[$i];
}
echo '<BR>'.$test_link;

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


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



у меня - работает. но только когда нет переводов строки. видимо, там какой-то флаг должен быть...

Добавлено @ 09:20 
угу. "." - это любой символ, кроме перевода строки.

Добавлено @ 09:21 
можно вместо "." сделать "(.|\n)"

Добавлено @ 09:23 
или можно использовать модификатор s, тогда "." будет соотвествовать любому символу, включая перевод строки.

Добавлено @ 09:24 
Цитата(tolik777 @  19.9.2006,  07:54 Найти цитируемый пост)
Все. Наконец разобрался. Вот так надо:

отлично. как-то сразу не заметил smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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