PDA

Показать полную графическую версию : Регулярное выражение


Страниц : 1 [2]

Jekamajor
22-08-2005, 20:36
я знаю, но тут мне эта инфа нужна не для конкретной цели, а так, для общего развития ;) Если знаете, подскажите плиз

Prisoner
23-08-2005, 10:59
В том-то и дело, что не ведаю :(. Проблема в работе класса - посимвольно он работает, не со словами.

Jekamajor
23-08-2005, 12:06
если б в [^abcd] можно было б указать, что это не беспорядочная последовательность символов, а конкретная, проблем бы не было.
или в простом /abcd/ поставить отрицание, но как? :(

Jekamajor
24-08-2005, 00:55
ладно, легче ориентироваться на конкретных примерах: пусть надо удалить из текста все теги. Регулярное выражение будет такое:
/<[^>]*>/gi;
А вот как справиться с такой задачей, если надо удалить все теги, кроме ссылок? т.е. кроме тегов <a href> и </a>?
Можно исключить букву 'a' в квадратных скобках: /<[^a>]*>/gi; но тогда не будут удаляться все теги, где встретится буква 'a', например <font color=blAck> не удалится, а надо, чтоб удалился.
Может создать выражение, которое не будет трогать только теги, начинающиеся с '<a ' и '</a ', а остальные все удалять? Но как такое сделать, я не знаю. Не хватает в голове чего-то. Не поможете мне справиться с такой задачей? Спасибо!

ivank
25-08-2005, 18:08
Как вариант - предварительно выбирать все теги. А потом уже отдельным регэкспом проверять дозволенный это тег или нет. Если пишется на перле, то надо обратить внимание на модификтор 'e' для регэкспов.

Выглядеть это будет примернол так:$text = q~
<p align="left"><a href="link">Link?</a></p>
~;

$text =~ s/(<.*?>)/change_tag($1)/eg;
print $text;

sub change_tag
{
$tag = $_ = shift;
# открывающий a - можно
return $tag if (/<\s*(a|a\s+.*?)>/i);
# закрывающий a - можно
return $tag if (/<\s*\/\s*a\s*>/i);
# всё остальное - нельзя
return "";
}

Этот код подразумевает, что внутри тега не встречается символа >, как и должно быть в правильном (x)html. Но на практике часто это требование не удовлетворяется (например <a href="javascript:if(a<b)call_comething_strange();">). В принципе регэкспы можно модифицировать и под подобные случаи, но тогда они будут уж слишком монстрообразны; мне лень.

Самый правильный метод, применим в случае если имеется валидный xhtml, тогда можно произвести довольно банально xslt преобразование. Вот.

Jekamajor
26-08-2005, 11:53
ой, блин, а это на перле? А как бы его переделать в javascript? Если это работает, то подойдет для большинства случаев, а <a href="javascript:if(a<b)call_comething_strange();"> не думаю, что такое будет часто встречаться :)
Спасибо!

ivank
26-08-2005, 14:02
гм... на jsavascript так не получится, его регэкспы понимают только модификаторы g, m и i...

Jekamajor
26-08-2005, 14:34
да, жалько, очень жалко




© OSzone.net 2001-2012