IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Помогите с регулярными выражениями (http://www.imho.ws/showthread.php?t=92910)

Kvazi 20.09.2005 17:52

Помогите с регулярными выражениями
 
НУжно в тексте найти тэг: <table (+атрибуты)> и заменить на тэг

<table class="itemView">

Делаю:

$descr = eregi_replace("<table*[^<]>",'<table class="itemView">',$_POST['itemAnn']);

неработает.
Подскажите правильный вариант и по возможности - скажите где я ошибся...
Заранее спасибо

RaZEr 20.09.2005 18:00

Я конечно не фанат ereg, но на первый взгляд (<table*[^<]>) ты задаёшь повтор буквы "e", а затем (<table*[^<]>) выделяешь всего один знак под все аттрибуты, т.к. не указал квантификатора. Правильный вариант будет наподобии: /\<table[^\>]*\>/

Scary Zet 01.10.2005 15:41

Попробуй
$descr = eregi_replace("<table(.*)>",'<table class="itemView">',$_POST['itemAnn']);

Andrey Zak 01.10.2005 18:13

Цитата:

Scary Zet:
$descr = eregi_replace("<table(.*)>",'<table class="itemView">',$_POST['itemAnn']);
можно еще "?" добавить перед (.*), чтоб также находить <table> без атрибутов. Пример, <table?(.*?)>
"?" после "*" нужен для того, чтобы найти вхождение до первой ">", а не до конца текста. Насколько я точно помню?

Scary Zet 01.10.2005 22:42

Цитата:

Сообщение от Andrey Zak
можно еще "?" добавить перед (.*), чтоб также находить <table> без атрибутов. Пример, <table?(.*?)>
"?" после "*" нужен для того, чтобы найти вхождение до первой ">", а не до конца текста. Насколько я точно помню?

+, ?, * - это квантификаторы. АФАИК, они ставятся после символа\группы символов в единственном числе. + означает одно или более повторений. ? - ноль или одно повторение. * - ноль или более. Точка сама по себе означает любой символ.

АФАИК, <table?(.*?)> неверно синтаксически из за вопроса после звёздочки. А вопрос после "e" означает, что эта буква может отсутствовать, что неверно логически.

Цитата:

нужен для того, чтобы найти вхождение до первой ">", а не до конца текста
Тогда надо написать
$descr = eregi_replace("<table([^>]*)>",'<table class="itemView">',$_POST['itemAnn']);

[^>] означает любой символ кроме '>'.

Hubbitus 02.10.2005 12:08

Цитата:

Scary Zet:
АФАИК, <table?(.*?)> неверно синтаксически из за вопроса после звёздочки.
Почему не верно-то? В данном контексте знак вопроса ограничивает жадность квантификатора *! И почти правильно писали
Цитата:

Andrey Zak:
нужен для того, чтобы найти вхождение до первой ">", а не до конца текста.
Только не до конца текста, а до последнего символа ">".

Ну и последнее: После е вопроск конечно не нужен, врядли встретится тег <tabl>. А вот про
Цитата:

Andrey Zak:
можно еще "?" добавить перед (.*), чтоб также находить <table> без атрибутов.
".*?" также будет соответствовать и пустому, так что в ту регу попадет и тег <table> без атрибутов.

Andrey Zak 02.10.2005 16:25

Цитата:

Hubbitus:
Только не до конца текста, а до последнего символа ">".
Все верно. Не правильно выразился.
Цитата:

Hubbitus:
Ну и последнее: После е вопроск конечно не нужен, врядли встретится тег <tabl>.
Две функции может иметь символ "?". В данном контексте он в роли квантификатора для метасимвола (.
Цитата:

? расширяет смысл метасимвола '(' , квантификатор, означающий ноль либо одно вхождение, квантификатор жадности
Источник: php.net

Hubbitus 02.10.2005 22:57

Цитата:

Andrey Zak:
Две функции может иметь символ "?". В данном контексте он в роли квантификатора для метасимвола (.
Не понял, и какой он квантификатор в данном случае перед "("?
Не могли бы вы пояснить тогда подробнее его смысл в конструкции "<table?(.*)?>"? Второй предельно понятен, а вот первый, кроме значения для буквы е "ноль или больше" никак не могу понять каое имеет.

Andrey Zak 03.10.2005 10:31

Цитата:

Hubbitus:
Не понял, и какой он квантификатор в данном случае перед "("?
Я привел цитату и указал ссылку на php.net. Попробуйте на примере все станет ясно. Я часто использовал данную конструкцию, правда в perl.

Hubbitus 03.10.2005 11:21

Цитата:

Andrey Zak:
Я привел цитату и указал ссылку на php.net. Попробуйте на примере все станет ясно.
Дак я и хочу на примере попробовать - подставлю разные строки. Только не могу понять в данном случае что проверять-то!?? Не могли бы пояснить на данном примере?

И вообще, кстати, попробовал тут собственно то что так долго все обсуждают:
Код:

<?
$text = '<table align=right other_attr>dfgdfgb <table>dcfg';

$descr = eregi_replace('<table(.*?)>', '<table class="itemView">', $text);
var_dump($descr);
?>

Причем с "<table?(.*?)>" вместо "<table(.*?)>" то же самое.
Дак вот, на это выдается ошибка:
Warning: eregi_replace() [function.eregi-replace]: REG_BADRPT in /path/to/file/reg.php on line xxx
bool(false)

И нифига не заменяется соответственно...

Если честно, в POSIX-регулярных выражениях я не слишком силен, и не стал копаться как исправить, да и тормозные они к сожалению. ИМХО, лучше для данного случая юзать PCRE, с подобными же регами.

Andrey Zak 03.10.2005 13:47

И впрямь как-то странно себя ведет. Что с ним, что без. Одно и тоже.
Код:

<?
$text = '<table align=right other_attr>dfgdfgb<table align=right other_attr> <table>dc<table align=right other_attr>fg';

preg_match_all("!<table(.*?)>!si", $text, $descr);
echo "<textarea rows=15 cols=65>";
print_r($descr);
echo "</textarea>";
?>

Залез в свои скрипты. Я ввел вас в заблуждение данной ссылкой. Хотя сам ни раз руководствовался именно этим источником.
$_ =~ /^http\:\/\/((.+)\:(.+)\@)?(.+)$/
Конструкция ()?, а не ?(). Может я, как-то не так читаю, или автором допущена ошибка (неточность)? Обычно я использую: "(куча все, что может и не появится при разборе)?" Специально проверил вариант ?() - ? работает проверки впереди идущего символа.

Jlamepok 03.10.2005 17:06

"#<table(.+?)>#is"

$text = preg_replace("#<table(.+?)>#is",...);

Hubbitus 04.10.2005 00:41

Цитата:

Jlamepok:
preg_replace
О чем я и говорил - pcre, в POSIX-регулярных выражениях такая рега не работает! В PCRE-то понятно, все элементарно.


Часовой пояс GMT +4, время: 22:22.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.