С нами с 10.09.03
Сообщения: 1313
Рейтинг: 513
|
Добавлено: 20/01/05 в 09:22 |
Совсем утрахался, перепробовал разные окольные пути, надо сделать такое:
>(НЕ"<a ")*</a>
пробовал так:
>(<a\s){0}*</a> и все в таком роде.
Вообще в шоке, прозрачных решений не вижу.
Вот бы было что-то типа (^foo), дык нетути...
|
|
|
|
С нами с 22.07.04
Сообщения: 361
Рейтинг: 308
|
Добавлено: 20/01/05 в 12:41 |
Гм... а зачем НЕ(</a>) вообще как-то особо отмечать? Тебе нужно найти подстроку, которая начинается на ">", потом идёт любой хлам, а потом - "</a>". Так? Ну вот и пишем:
И всё работает, по-крайней мере у меня. Там ещё кстати от настройки Greedy кой-чего зависит, если надо будет - расскажу
|
|
|
|
С нами с 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. А про жадность узнал сегодня, (.*?) - вот нежадный паттерн.
|
|
|
|
С нами с 22.07.04
Сообщения: 361
Рейтинг: 308
|
Добавлено: 20/01/05 в 13:32 |
Эээ... ты на чём программишь? Мне тогда легче будет тебе подсказать путь к истине
|
|
|
|
С нами с 10.09.03
Сообщения: 1313
Рейтинг: 513
|
Добавлено: 20/01/05 в 13:37 |
php, PCRE
|
|
|
|
С нами с 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> станут вполне закрытыми
З.Ы. Если работает - с тебя рейтинг
|
|
|
|
С нами с 10.09.03
Сообщения: 1313
Рейтинг: 513
|
Добавлено: 20/01/05 в 17:51 |
Хмм, в два подхода, говоришь...
Попобую. Но, все-таки, почему не сделали они что-то типа ^(subpattern) или (^subpattern)...
|
|
|
|
С нами с 22.07.04
Сообщения: 361
Рейтинг: 308
|
Добавлено: 20/01/05 в 19:26 |
Да потому что это логически некорректно - ^subpattern есть бесконечное множество вариантов, и под это выражение фактически подходит любая подстрока. Даже если есть строка типа "abcdefghijklmnop", то как тут найти "^cde" ??? Ведь если возможна такая конструкция (^pattern), то всё регулярное выражение вполне может быть этим самым ^pattern, и больше ничего не содержать. Тогда под это регулярное выражение попадает фактически любая подстрока данной строки, за исключением самой "cde", без всякой последовательности - в том числе и вся строка целиком. И тогда получается что обнаружение ^pattern сводится к простому сравнению двух строк С символами проще - их ограниченное количество, а вот строк, увы, бесконечно много. Вот такая примерно ботва. Хотя возможно я неясно выразился.
З.Ы. А може я вообще не прав, и существует возможность искать ^pattern, но некоторые познания в теории компиляторов а также скромный опыт в написании этих самых компиляторов (лексический, синтаксический и семантический анализ) подсказывают мне, что дело обстоит примерно так
|
|
|
|
С нами с 10.09.03
Сообщения: 1313
Рейтинг: 513
|
Добавлено: 20/01/05 в 19:45 |
|
|
|
|