Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Проблема с preg_match


Автор: tolik777 18.9.2006, 18:05
Есть 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;

Автор: skyboy 18.9.2006, 18:39
что за странное отделение при помощи символов "|"?

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

Автор: skyboy 18.9.2006, 18:55
кста, 
Цитата

[^<\/form]

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

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

как я понимаю, квантификатор повторения применяется либо к группе(при выделении в скобки), либо к последнему символу(или псевдосимволу, аки "\s"). 

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


Цитата

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

Мне начало формы не нужно. Тут все работает. Мне надо идти от <form.......>, далее до закрывающего тэга формы </form> и между этими тэгами проверить есть ссылка <a href ......., и все что между этими тэгами находиться пропустить, т.е. проверку не делать, там может быть какой-угодно html код.

Автор: skyboy 18.9.2006, 19:39
давай ты скажешь, по каким признакам информацию собираешься искать, а? А то по твоей регулярке сильно не определишь, чего тебе надобно... то, что ищешь содержимое ссылки внутри формы это я понял. а подробнее? одна это ссылка или нет? по чём её определяешь(если не одна она такая)? по адресу? по классу?

Автор: tolik777 19.9.2006, 07:52
Вообщем задача такая проверить, был ли установлена форма на определенной странице. Форма включает в себя форму поиска и снизу ссылки.
Чтобы всю форму не проверять, мне достаточно проверить:
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>
Вот и все.
Первый пункт я сделал, а вот дальше не могу сдвинуться.

Автор: skyboy 19.9.2006, 08:42
Код

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

проверяем наличие в форме ссылки с классом link_box.

Автор: tolik777 19.9.2006, 08:54
Код

$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;

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

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

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

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

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

отлично. как-то сразу не заметил smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)