Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Тексты > Регулярное выражение |
Автор: Frozen_Coyote 15.10.2007, 20:52 |
Прошу помощи! Есть тэг <TD class=xl26 colSpan=5 style="BORDER-RIGHT: #ece9d8; BORDER-TOP: #ece9d8; BORDER-LEFT: #ece9d8; WIDTH: 272pt; BORDER-BOTTOM: #ece9d8; HEIGHT: 60pt; BACKGROUND-COLOR: transparent" width=363 > нужно чтобы после TD вычищало все, кроме colspan=5. вместо 5 может быть двухзначное число. Вроде как то через исключение [^colspan=\d{1,2}] но четко не получается. помогите плиз. |
Автор: sTa1kEr 16.10.2007, 07:35 | ||
Так нельзя писать, т.к. в квадратных скобках перечисляются символы, а не целковые фразы. Для этого используются http://ru2.php.net/manual/ru/reference.pcre.pattern.syntax.php. Но можно и без утверждений обойтись.
|
Автор: Frozen_Coyote 16.10.2007, 08:23 |
Спасибо большое, отлично сработало, но если допустим в тэге colspan не присутствует - выражение оставляет его нетронутым. Я может некорректно выразился, но нужно чтобы выражение оставляло colspan если оно есть в тэге, если его нет - вычищало полностью, оставляя только <td>. наверно это надо через какие то хитрый preg_match делать? |
Автор: SelenIT 16.10.2007, 12:35 | ||
Frozen_Coyote, попробуйте вот такую модификацию:
Отличия от варианта sTa1kErа - еще одна пара скобок с "?" и минимизатор жаности первого "*". |
Автор: Frozen_Coyote 16.10.2007, 18:49 | ||||
Спасибо! Суперски! А можно еще попросить помочь: опять не могу сообразить: мне нужно чтобы выражение при нахождении в строке кроме colspan еще и rowspan оставляло его также, для чего попробовал применить хитрый на мой взгляд способ, заменив в выражении в слове colspan c и l на точки (ну чтобы rowspan тоже цепляло). так вот: цепляет только один из двух находящихся в строке сопадений: если первый colspan - отобразит его (второй rowspan потрет) ну и наоборот. Подскажите, как заставить выражение в случае обнаружения обоих параметро оба и оставлять? $Out = preg_replace("/<td\s+[^>]*?((\s.o.span=(?(?='|\")('|\")\d+\\3|\d+\b))[^>]*)?>/is", "<td$2>", $In); |
Автор: sTa1kEr 17.10.2007, 08:48 | ||
Frozen_Coyote, написал класс для. Производительность, конечно, немного пострадает, но зато универсальный.
Добавлено @ 08:48 Это для PHP 5. |
Автор: Frozen_Coyote 17.10.2007, 23:20 |
sTa1kEr, огромное Вам спасибо за помощь. Очень признателен. |
Автор: SelenIT 17.10.2007, 23:44 |
sTa1kEr, красиво, впечатляет;). Одиночной регуляркой, насколько я понимаю, вопрос никак не решить (по крайней мере у меня, как я ни пробовал, не получилось)? Пожалуй, preg_replace_callback действительно тут оптимум... вот только меня немного смущает лямбда-функция в цикле - если я ничего не путаю, в каких-то прежних версиях она создавалась заново при каждой итерации... в актуальных версиях это не так? |
Автор: Frozen_Coyote 18.10.2007, 21:12 | ||
Господа, а как вам такой вот вариант я сделал? ![]() ![]() ![]()
|
Автор: SelenIT 19.10.2007, 01:32 | ||
Frozen_Coyote, весьма неплохо, только sTa1kErовские "навороты" в реге для перехвата значений атрибута вне зависимости от того, заключены ли они в какие-либо кавычки, уместны в ф-ции DoIt, а не в preg_replace_callback. Предлагаю уточненно-упрощенный вариант:
|
Автор: Frozen_Coyote 19.10.2007, 07:43 |
SelenIT, реально Ваш вариант лучше ![]() |