Метасимвол или фраза в регулярных выражениях

Leonid

PHP? нет, не слышал...
Метасимвол или фраза в регулярных выражениях

Я немного запутался с регулярными выражениями... Результат часто не тот, что я ожидаю...
Что означает запись [^copy]*
1. Должны быть любые символы, кроме слова copy
2. Должны быть любые символы, кроме символов c o p i , причем они могут быть в любом порядке и количестве, в перемешку с другими, например pp 88 oip uu c
3. Должны быть символы o p i, не должен быть символ с
4. Должно быть слово opi, перед ним любой символ кроме c

5. Что-то другое....

-~{}~ 07.09.06 13:23:

Мне нужен именно первый вариант, надо проверить, что между определенными символами нет определенного слова.. Как это записать?
 

Leonid

PHP? нет, не слышал...
В общем задача - проверить, что между <td> и </td> нет слова copy, но там может быть любое количество любых других символов и слов

<td>([^c][^o][^p][^y])</td>

Куда-то еще надо дописать *, чтбы обозначить что символов может быть любое количество.
 

Гравицапа

elbirret elcno
Может более полно опишешь зачем тебе это?
PHP:
<?php

$str = '<td>dsfl;jk copy 55</td>';

if (preg_match( '#<td>.*copy.*</td>#',$str))
{
  echo 'Found it!';
}
?>
 

Leonid

PHP? нет, не слышал...
Гравицапа
Ты проверяешь наличие, а надо проверить отсутствие. Дело в том, что эта проверка входит в сложное регулярное выражение, типа здесь должно быть то-то, здесь не должно быть этого, а здесь должно быть еще что-то....
 

whirlwind

TDD infected, paranoid
Leonid ну так поставь вокруг copy . с ограниченным квантификатором
 

Leonid

PHP? нет, не слышал...
whirlwind
Что значит ". с ограниченным квантификатором "?

Как показала практика, запись .*[^c][^o][^p][^y].* аналогична .*
 

whirlwind

TDD infected, paranoid
ps. гоню. щас подумаю

-~{}~ 07.09.06 14:08:

PPS а вообще Гравицапа прав, если ничего извлекать не нужно
 

Leonid

PHP? нет, не слышал...
whirlwind точно гонишь, не работает
А извлекать нужно...
 

invander

Новичок
<?php

$str = '<td>dcvsfl;jk copy 55</td>';

if (preg_match( "/<td>.+(copy)[^<]+<\/td>/i",$str,$temp))
{
echo 'Found it!';
echo "<pre>";
print_r($temp);
echo "</pre>";
}



По идиотски, но работает
 

whirlwind

TDD infected, paranoid
PHP:
$s1 = "<td>dsfl;jk copy 55</td><td>dsfl;jk cpy 55</td>";
var_dump(preg_match('/<td>(((?<!copy).)*?)<\/td>/',$s1,$m));
var_dump($m);
это дико тормозной вариант. быстрее вряд ли есть. да он скорее всего не нужен. лучше объясни чего ты хочешь получить
 
Сверху