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

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

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

 

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

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

тема: Паттерн. Выбросить ненужное.
 
 автор: Лена   (22.01.2009 в 17:44)   письмо автору
 
 


<?php
$text 
'</a>                             <a href="http://www.budshop.com.ua/index2.php?option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153"
 target="_blank" onclick="window.open('
http://www.budshop.com.ua/index2.php?
option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153','
win2','status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,heig
ht
=480,directories=no,location=no'); return false;" title="Печать"></a>';

$text preg_replace('#^' preg_quote('\s+<a href=(.)*title="Печать"></a>'). '$#si',"",$text);
print 
$text;
?>


Нужно выбросить все ссылки, в которых встречается title="Печать", остальные - оставить. Перед каждой такой ссылкой каждый раз встречается куча пробелов. Их тоже надо выбросить.
У меня сейчас ошибка: Parse error: syntax error, unexpected T_STRING in Z:\home\avart.ua\www\preg.php on line 2
Это - сама текстовая строка.

  Ответить  
 
 автор: Trianon   (22.01.2009 в 18:06)   письмо автору
 
   для: Лена   (22.01.2009 в 17:44)
 

$text = '</a> <a href="http://www.budshop.com.ua/index2.php?option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153"
target="_blank" onclick="window.open('
http...

Ага?

  Ответить  
 
 автор: Лена   (22.01.2009 в 23:43)   письмо автору
 
   для: Trianon   (22.01.2009 в 18:06)
 

Ни ага. Но красные не сдаются :)

Пока не вырезается, но сейчас такой вариант:

<?php
$text 
'Мне нужно это выбросить</a>                             <a href="http://www.budshop.com.ua/index2.php?option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153" 
target="_blank" onclick="window.open(' 
addslashes("'http://www.budshop.com.ua/index2.php?
option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153','
win2','status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,heig
ht=480,directories=no,location=no'"
) . '; return false;" title="Печать"></a>';
$text preg_replace('#^' preg_quote('\s+<a href\s*=\s*"http\:\/\/[^"]+".*?title="Печать"></a>'). '$#si',"",$text);
print 
$text;
?>

  Ответить  
 
 автор: Trianon   (23.01.2009 в 17:37)   письмо автору
 
   для: Лена   (22.01.2009 в 23:43)
 

потеряли одну скобку перед ; return false;" title="Печать"

и как-то странно у вас с preg_quote() .
Внутри preg_quote метасимволов шаблона быть не может. Они все будут заэкранированы.
Собственно, это основное назначение preg_quote().

  Ответить  
 
 автор: Лена   (24.01.2009 в 00:21)   письмо автору
 
   для: Trianon   (23.01.2009 в 17:37)
 

>Они все будут заэкранированы.
и превратятся в обычные символы. От preg_quote() отказалась. А скобку добавила. Уже упростила паттерн проще некуда, и все равно не срабатывает.

<?php 
$text 
'Мне нужно это выбросить</a>                             <a href="http://www.budshop.com.ua/index2.php?option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153"  
target="_blank" onclick="window.open(' 
addslashes("'http://www.budshop.com.ua/index2.php? 
option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153',' 
win2','status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,heig 
ht=480,directories=no,location=no'"
) . '); return false;" title="Печать"></a>'
$text preg_replace('#^\s+<a href="[^"]+".*?title="Печать"></a>$#si',"",$text); 
print 
$text
?>

  Ответить  
 
 автор: BinLaden   (24.01.2009 в 00:32)   письмо автору
 
   для: Лена   (24.01.2009 в 00:21)
 

> addslashes

Это неправильно, так как Вам нужно правильно оформить литеральную константу (короче, строку в коде) именно «ручками», в редакторе. Можно открыть тот же Блокнот, скопировать туда текст, заменить «\» и «'» на «\\» и «\'» соответственно (именно в таком порядке).

А паттерн примерно такой:
<?php
$text 
'</a>                             <a href="http://www.budshop.com.ua/index2.php?option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153" 
 target="_blank" onclick="window.open(\'http://www.budshop.com.ua/index2.php? 
option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153\',\' 
win2\',\'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,heig 
ht=480,directories=no,location=no\'); return false;" title="Печать"></a>'
;

$text preg_replace('/<a[^>]+?title="Печать">.*?<\\/a>/is'''$text);
?>

P.S. Есть форма записи строки, называемая nowdoc:

<?php
$text 
= <<<'TEXT'
</a>                             <a href="http://www.budshop.com.ua/index2.php?option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153" 
 target="_blank" onclick="window.open('http://www.budshop.com.ua/index2.php? 
option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153',' 
win2','status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,heig 
ht=480,directories=no,location=no'); return false;" title="Печать"></a>
TEXT;
?>

Вот туда действительно можете пихать любой текст, не содержащий «TEXT;» (Ваш идентификатор, не обязательно TEXT), без доп. обработки.

  Ответить  
 
 автор: Лена   (24.01.2009 в 17:09)   письмо автору
 
   для: BinLaden   (24.01.2009 в 00:32)
 

В мануале отмечено, что nowdoc введен в PHP 5.3.0. У меня третий Денвер стоит, где версия PHP 5.2.4. Поэтому у меня появляется ошибка:
Parse error: syntax error, unexpected T_SL in Z:\home\avart.ua\www\preg_.php on line 2
Давно хотела спросить: а где можно посмотреть значения этих ошибок? Где тот список, где написано, что ошибка T_SL - это... ?

Если применить форму записи heredoc, то в строку придется добавить слэши перед ", так как heredoc - та же самая строка, только в двойных кавычках.
Тогда пример будет так выглядеть:

<?php 
$text 
= <<<THANK_YOU_BINLADEN
</a>                             <a 

href=\"http://www.budshop.com.ua/index2.php?option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153\"  
 target=\"_blank\" onclick=\"window.open('http://www.budshop.com.ua/index2.php?  
option=com_content&amp;task=view&amp;id=3358&amp;pop=1&amp;page=0&amp;Itemid=153','  
win2','status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,heig  
ht=480,directories=no,location=no'); return false;\" title=\"Печать\"></a>
THANK_YOU_BINLADEN;
$text preg_replace('/<a[^>]+?title="Печать">.*?<\/a>/is'''$text); 
?>


Вот это работает. Хотя толку от него столько же, как и в случае, если лепить слэши перед одинарными кавычками.

С addslashes не понятно. Какая разница, проставлю я эти слэши руками или за меня это сделает функция?

PS У вас в коде ошибка. Вот здесь:
$text = preg_replace('/<a[^>]+?title="Печать">.*?<\\/a>/is', '', $text);
Надо так(слэш один убрала):
$text = preg_replace('/<a[^>]+?title="Печать">.*?<\/a>/is', '', $text);

  Ответить  
 
 автор: BinLaden   (24.01.2009 в 17:31)   письмо автору
 
   для: Лена   (24.01.2009 в 17:09)
 

> Где тот список, где написано, что ошибка T_SL - это... ?

Скорее всего это не ошибка, а какой-то token. Весь код состоит из этих token'ов и они могут следовать в определенном порядке. Если порядок нарушен, то появляется "syntax error, unexpected ...".

> Если применить форму записи heredoc, то в строку придется добавить слэши перед ", так как heredoc - та же самая строка, только в двойных кавычках.

Надо экранировать «\», «$».

> С addslashes не понятно. Какая разница, проставлю я эти слэши руками или за меня это сделает функция?

Вы ставите бекслеши («\») чтобы парсер PHP правильно интерпретировал строку. Попробуйте сформировать и вывести на экран строку «It's my "little" puppy» (тут и кавычки и апостроф) без heredoc/nowdoc двумя способами: с помощью ручного экранирования (самому добавить бекслеши) и попытаться это проделать с addslashes(). Думаю, Вы поймете о чём я говорю.

> У вас в коде ошибка. Вот здесь:

Я бы не назвал это ошибкой, я сознательно поставил 2.

  Ответить  
 
 автор: Лена   (25.01.2009 в 19:07)   письмо автору
198.5 Кб
 
   для: BinLaden   (24.01.2009 в 17:31)
 

>Скорее всего это не ошибка, а какой-то token.
Вы правы. Нашла список этих token'ов. Прикрепила.

>Попробуйте сформировать и вывести на экран строку «It's my "little" puppy»
Пример-провокация. Да я даже строку для addslashes() не могу сформировать, так как все равно приходиться что-то(или ", или') экранировать руками. А потом, если применяешь addslashes() , то ерунда получается. Поняла.

>Я бы не назвал это ошибкой, я сознательно поставил 2.
Вот в этом не уверена, но мне кажется, что второй слэш, потому что в одинарных кавычках экранируется слэш.

  Ответить  
 
 автор: Trianon   (25.01.2009 в 19:22)   письмо автору
 
   для: Лена   (25.01.2009 в 19:07)
 

>>Я бы не назвал это ошибкой, я сознательно поставил 2.
>Вот в этом не уверена, но мне кажется, что второй слэш, потому что в одинарных кавычках экранируется слэш.

Вот именно потому, что один из слэшей уходит на экран другого, в шаблон отправится лишь один из них. И такая запись логически более корректна.

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

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