Реклама на сайте Advertise with us

Помогите с regexp: как исключить подстроку?

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 10.09.03
Сообщения: 1313
Рейтинг: 513

Ссылка на сообщениеДобавлено: 20/01/05 в 09:22       Ответить с цитатойцитата 

Совсем утрахался, перепробовал разные окольные пути, надо сделать такое:
>(НЕ"<a ")*</a>
пробовал так:
>(<a\s){0}*</a> и все в таком роде.
Вообще в шоке, прозрачных решений не вижу.
Вот бы было что-то типа (^foo), дык нетути...

0
 



С нами с 22.07.04
Сообщения: 361
Рейтинг: 308

Ссылка на сообщениеДобавлено: 20/01/05 в 12:41       Ответить с цитатойцитата 

Гм... а зачем НЕ(</a>) вообще как-то особо отмечать? Тебе нужно найти подстроку, которая начинается на ">", потом идёт любой хлам, а потом - "</a>". Так? Ну вот и пишем:
Код:

>(.*)</a>


И всё работает, по-крайней мере у меня. Там ещё кстати от настройки Greedy кой-чего зависит, если надо будет - расскажу icon_smile.gif

0
 



С нами с 10.09.03
Сообщения: 1313
Рейтинг: 513

Ссылка на сообщениеДобавлено: 20/01/05 в 12:54       Ответить с цитатойцитата 

Ыыыыы, тут, брат, все хитро.
Я наткнулся на такие случаи, когда тег </a> не закрывают, а паттерн зажирает все до ближайшего закрывающего </a>.
Что там по спецификации прерывает работу ссылки (</?table там или еще какой </?t[rd]) мне пока некогда читать, хочу просто рубить такие ссылки по открывающему <a.
Потому надо указать, что ссылка у меня <a blabla>НЕ<a\s</a>
Тогда битые вообще не будут учитываться.
А еще лучше:<a blabla>НЕ(<a\s)(</a>)?
Тогда все будут, но текст у битых будет весь, до следующей ссылки.

P. S. А про жадность узнал сегодня, (.*?) - вот нежадный паттерн.

0
 



С нами с 22.07.04
Сообщения: 361
Рейтинг: 308

Ссылка на сообщениеДобавлено: 20/01/05 в 13:32       Ответить с цитатойцитата 

Эээ... ты на чём программишь? Мне тогда легче будет тебе подсказать путь к истине icon_smile.gif

0
 



С нами с 10.09.03
Сообщения: 1313
Рейтинг: 513

Ссылка на сообщениеДобавлено: 20/01/05 в 13:37       Ответить с цитатойцитата 

php, PCRE

0
 



С нами с 22.07.04
Сообщения: 361
Рейтинг: 308

Ссылка на сообщениеДобавлено: 20/01/05 в 16:29       Ответить с цитатойцитата 

Дак всё просто:
Код:

$html = "<p><a href='aaa'>Pisikaka</p>";
echo(preg_replace("/(<a.*>.*)<\/([^a]|a.+)/i", "\\1</a>", $html));

Это должно решить твои проблемы, если я тебя правильно понял. Все незакрытые теги <a> станут вполне закрытыми icon_smile.gif

З.Ы. Если работает - с тебя рейтинг icon_smile.gif

1
 



С нами с 10.09.03
Сообщения: 1313
Рейтинг: 513

Ссылка на сообщениеДобавлено: 20/01/05 в 17:51       Ответить с цитатойцитата 

Хмм, в два подхода, говоришь...
Попобую. Но, все-таки, почему не сделали они что-то типа ^(subpattern) или (^subpattern)...

0
 



С нами с 22.07.04
Сообщения: 361
Рейтинг: 308

Ссылка на сообщениеДобавлено: 20/01/05 в 19:26       Ответить с цитатойцитата 

Да потому что это логически некорректно - ^subpattern есть бесконечное множество вариантов, и под это выражение фактически подходит любая подстрока. Даже если есть строка типа "abcdefghijklmnop", то как тут найти "^cde" ??? Ведь если возможна такая конструкция (^pattern), то всё регулярное выражение вполне может быть этим самым ^pattern, и больше ничего не содержать. Тогда под это регулярное выражение попадает фактически любая подстрока данной строки, за исключением самой "cde", без всякой последовательности - в том числе и вся строка целиком. И тогда получается что обнаружение ^pattern сводится к простому сравнению двух строк icon_smile.gif С символами проще - их ограниченное количество, а вот строк, увы, бесконечно много. Вот такая примерно ботва. Хотя возможно я неясно выразился.

З.Ы. А може я вообще не прав, и существует возможность искать ^pattern, но некоторые познания в теории компиляторов а также скромный опыт в написании этих самых компиляторов (лексический, синтаксический и семантический анализ) подсказывают мне, что дело обстоит примерно так icon_smile.gif

0
 



С нами с 10.09.03
Сообщения: 1313
Рейтинг: 513

Ссылка на сообщениеДобавлено: 20/01/05 в 19:45       Ответить с цитатойцитата 

Чую, что без http://www.citforum.ru/book/regv/regv_c.shtml не обойтись...

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »