Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: помогите заменить текст
 
 автор: Лена   (12.09.2008 в 09:48)   письмо автору
 
 

Помогите, пожалуйста. Не работает регулярное выражение вот в таком примере:

<?php
$text 
"<a style=\"background:url('/img/ltd/mor.gif') 100% 50% no-repeat;font:11px Tahoma;text-decoration:underline;display:block;padding:5px 15px\" href=\"http://www.kanzas.ua/go/ru/news\">";

$text preg_replace ("#<a style=\"background:url('[A-Za_z0-9_]*')(.)*\" href=\"(.)*\">#is""asdf"$text);
print
$text;

?>

  Ответить  
 
 автор: xx77   (12.09.2008 в 10:32)   письмо автору
 
   для: Лена   (12.09.2008 в 09:48)
 

не заэкранированы скобки () , которые должно находить в строке, а в выражении это метасимволы

в классе символов [A-Za_z0-9_] не все символы из адреса картинки

> (.)*\" href=

(.)*\" ; жадный квантификатор * вберёт все любые символы (.) , и потом с \" совпадёт самая последняя кавычка во всём совпавшем тексте.
и подмаска (.)* не имеет смысла если было-бы нужно зачваченное в $номер значение ,
был-бы получен только самый последний символ из всей пройденной строки

<?
$text 
preg_replace ("#<a style=\"background:url\('[A-Za_z0-9/\.]*'\).*?\" href=\".*?\">#is""asdf"$text); 
print 
htmlspecialchars($text); 

например здесь изменён класс , на [A-Za_z0-9/\.] .
Инвертирована жадность двух .*
, путём изменения на .*? .
Убраны все захватывающие подмаски , т.к. они как-бы не нужны

А вообще если нужно просто заменить все ссылки начинающиеся так : <a style="background:url(,
то можно сделать проще

<?
$text 
preg_replace ('#<a style="background:url\([^>]+>#is'"asdf"$text); 
print 
htmlspecialchars($text); 

заменил кавычки " на ' , что-бы не экранировать " лишний раз

или нужно заменить что-то другое ?

  Ответить  
 
 автор: Лена   (12.09.2008 в 10:57)   письмо автору
 
   для: xx77   (12.09.2008 в 10:32)
 

Спасибо большое, вы мне помогли.
Только не поняла одного:

>и подмаска (.)* не имеет смысла если было-бы нужно зачваченное в $номер значение ,
>был-бы получен только самый последний символ из всей пройденной строки

почему будет получен последний символ?

  Ответить  
 
 автор: Trianon   (12.09.2008 в 11:24)   письмо автору
 
   для: Лена   (12.09.2008 в 10:57)
 

в скобках только точка.
Точка в регулярных выражениях отвечает (соответствует) любому одному символу.

  Ответить  
 
 автор: xx77   (12.09.2008 в 11:31)   письмо автору
 
   для: Лена   (12.09.2008 в 10:57)
 

вообще захватывающая подмаска () применяется для захвата подстроки из совпавшей строки

Бывает иногда ещё например необходимость сгруппировать набор альтернатив;
например #a(b|B)# без подмаски будет выглядеть так #ab|aB#,
и в обоих случаях будет совпадать с ab или aB
но в этом случае лучше пользоваться "группирующей" ,или как называют, "незахватывающей" подмаской,(?:),
применительно к этому примеру #a(?:b|B)#
т.к. в первом случае будет требоваться дополнительная память для хранения совпавшей b или B ,
при этом эта подстрока хранилась-бы в $1.

насчёт (.)* на примерах )

<?

$text 
"abcdef"

$t preg_replace ('#(.)*#''$0 - ($1)'$text1); 
print 
$t '<hr/>'

$t preg_replace ('#(.*)#''$0 - ($1)'$text1); 
print 
$t '<hr/>'

$t preg_replace ('#(..)*#''$0 - ($1)'$text1); 
print 
$t '<hr/>'

  Ответить  
 
 автор: Лена   (12.09.2008 в 12:41)   письмо автору
 
   для: xx77   (12.09.2008 в 11:31)
 

Я все поняла. У вас просто запись другая. Я не так пишу.
У меня если текст совпадает со всем патэрном, пишу \\0, а субпатерны в скобках у меня соответственно \\1 \\2 и т.д.
Как-то я пропустила форму записи через $0, $1 и т.д., теперь буду знать, спасибо. Так, как у вас, лучше, потому что в регулярных выражениях и так много обратных слэшей.

  Ответить  
 
 автор: xx77   (12.09.2008 в 13:46)   письмо автору
 
   для: Лена   (12.09.2008 в 12:41)
 

,)> записи через $0, $1 и т.д.
> Так, как у вас, лучше
Это как посмотреть, тоже приходится экранировать , если строка замены бывает в двойных кавычках

и в том моём шаблоне
<?
preg_replace 
('#<a style="background:url\([^>]+>#is'"asdf"$text);

мне не надо было добавлять модификатор "s",
'#<a style="background:url\([^>]+>#i' было-бы так-же,
поскольку "s" нужно только для того чтобы метасимвол "." совпадал-бы с символом новой строки тоже
, а здесь нет "."

  Ответить  
 
 автор: Лена   (12.09.2008 в 15:56)   письмо автору
 
   для: xx77   (12.09.2008 в 13:46)
 

вы по какому учебнику учились?

  Ответить  
 
 автор: vitali   (12.09.2008 в 16:02)   письмо автору
 
   для: Лена   (12.09.2008 в 15:56)
 

Возьмите книгу Дж. Фридла "Регулярные выражения" И жизнь окажется проще

  Ответить  
 
 автор: xx77   (12.09.2008 в 19:07)   письмо автору
 
   для: Лена   (12.09.2008 в 15:56)
 

и не настолько я и учёный в этих выражениях )
наверное язык регулярных выражений - самый скупой на слова язык програмирования, если его можно так назвать, в нём всего используется несколько символов \?^$+*.|[-]{,}(:<=>) и буквы sumxRU (это в php и если ничего не забыл перечислить), что-бы находить любые символы и их сочетания. и поэтому он даётся даже таким редко-можноСказатьСовсемНе-читающим как я :)

Но незнаю как ответить на Ваш вопрос, Елена, если позволите мне так Вас назвать(меня Михаил, если что )), и даже знаю что никакой пользы Вам мой ответ не принесёт ) ответ наверное примерно такой:

Вы не поверите , по телефону ;))
нашёл бесплатный хостинг с php , написал своё первое <?
if (что-то там) echo ""; ?>,
спасибо Норвегии (за OperaMini) и онлайн-фтп-сервисам (в часности за тот ftp что был на http://mysiem.net , лично человеку называвшемуся Punk77) ,)
, тк вот ,
вскорости начал почитывать этот форум и переделывать скрипты, нашёл здесь в справочнике функций страничку с описанием синтаксиса регулярных выражений в php, прочитал , мало чего понял, что-то стал делать и переодически снова и снова :) начал читать её и похожую почти такую-же из мануала к php
(не стараясь придумать что-то самому , не реально выучить
этот язык)
первым моим вопросом в этот форум , был вопрос, похожий на Ваш ,
http://softtime.ru/forum/read.php?id_forum=6&id_theme=28301
И без помощи здесь пользователей форума, наверное не продвинулся-бы в этих выражениях хотя-бы настолько на сколько продвинулся ;)
отдельно спасибо каждому ))
kasmanaft (кстати чевоито он пропал, я-то понятно пропадаю , никогда не мог быть здесь постоянно), ЯR, SHAman, cheops (практически открывший дверь в мир программирования ))
, Trianon тоже помогал :)))
и другие продвинутые пользователи )
И ещё эта моя манера постить всё подряд , дабы, если повезёт, кто-то поправит меня , и укажет на ошибки ))
даже в этом посте , я не был уверен правильно-ли называю всякие моди-кванти-фикаторы, но вроде не поправили ещё )
а книгу Фридла я недавно читал , только выборочно-бегло, ещё формат нашёл только .djvu
неудобный формат.
и забыл сказать , в прошлом году купил комп , поставил денвер (спасибо создателю денвера )), и теперь изучаю Perl
, тоже немного продвигаемый изучением в изучении preg.
Но даже в perl , многие вещи с помощью одних регулярных выражений сделать нельзя, и чем больше вы хотите от шаблона и сложнее выражения, тем медленнее они работают , тем становится нежелательнее применять их в постоянно-эксплуатируемых на сайте скриптах.
Постоянные Слишком сложный анализ и обработка текста скриптами не сделают сайт настолько полезнее насколько медленнее.

В своё время была у меня табличка наиболее часто применяемых шаблонов, очень помогала в начале изучения, но она затерялась в многочисленных сменах сайтов и переустановках операционной системы .
Попробую поискать в ближайшее время.

А из сграбленного мной в последнее время ,) есть только описание синтаксиса применительно к Perl, думаю это изучать только сложнее для Вас, поскольку все примеры на Perl.
Практика полезнее теории, в изучении,
потому-как теория такая-же сжатая как и сам язык регулярных выражений , хоть и кросс-платформенно-кросс-язычный , но везде слегка разный

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования