Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не пойму почему не работает регулярное выражение 
:(
    Опции темы
V0fka
Дата 11.3.2016, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Есть такая строка

test1
<script>
var x = "sfsdf";
</script>
test2

Хочу убрать из неё тег script и то, что внутри него. Пробую это сделать так:

Код

$output = preg_replace("/<script>[\n.]*<\/script>/", "", $input);


Но в результате ничего не происходит. Подскажите, пожалуйста, почему?
PM MAIL   Вверх
ksnk
Дата 11.3.2016, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

/<script>.*?<\/script>/s

`?` поможет избежать странных ситуаций с множеством скриптов.
модификатор `s` позволит точке захватывать и символы перевода строки.

Почему не сработал символьный класс - мутная история, даже добавление \r не помогает. 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
V0fka
Дата 11.3.2016, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



ksnk, так работает, спасибо!

Цитата(ksnk @  11.3.2016,  17:54 Найти цитируемый пост)
`?` поможет избежать странных ситуаций с множеством скриптов.

А можно немножко подробнее? Я не могу понять зачем тут "?". Попробовал без него, тоже работает вроде. smile 
PM MAIL   Вверх
ksnk
Дата 11.3.2016, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

test1
<script>
var x = "sfsdf";
</script>
test2

test3
<script>
var y = "sfsdf";
</script>
test4


А на таких данных без вопросика сработает?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
_zorn_
Дата 12.3.2016, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 6
Всего: 12



В пхп кто то еще использует слэши для определения границ регекспов ?

Неужели так веселей с заборами
Код

'/http:\/\/([^\/]+?)\//'

чем так ?
Код

'#http://([^/]+?)/#'

Где быстрее поймёшь что делает регулярка, в первом или втором примере ?   smile 

Цитата(ksnk @  12.3.2016,  00:54 Найти цитируемый пост)
`?` поможет избежать странных ситуаций с множеством скриптов.

Ситуации не странные. По умолчанию + и * жадные (берут все до последнего вхождения). Вопросик инвертирует жадность (берут до первого вхождения если были жадные). 
Есть даже модификатор чтобы квантификаторы были не жадные.

Цитата(ksnk @  12.3.2016,  00:54 Найти цитируемый пост)
Почему не сработал символьный класс - мутная история, даже добавление \r не помогает.  

Ничего мутного. Там впридачу еще двойные кавычки. Так что \n пхп УЖЕ перевёл в перевод строки перед тем как отправить на растерзание движку регекспов (с двойными кавычками надо было \\n - сами себе заборы городите).
Чтобы избегать таких "странных" ситуаций, я всегда использую одинарные кавычки и решетки как границу регекспа.

В вашем же случае правильная регекспа будет выглядеть так (иначе можно будет замутить <script>alert('OLOLO')</script   > и браузер это отработает)
Код

$output = preg_replace('#<script.*?>.*?</script.*?>#s', '', $input);

Модификатор "s" включает переводы строки в "."

ЗЫ. А почему не htmlspecialchars ?

Это сообщение отредактировал(а) _zorn_ - 12.3.2016, 06:36
PM MAIL   Вверх
ksnk
Дата 12.3.2016, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(_zorn_ @  12.3.2016,  06:21 Найти цитируемый пост)
Ничего мутного. 

Да ну? Тот факт, что точка НЕ может использоваться как элемент символьного класса не мутен?  
По идее, класс [\r\n.] должен бы выбирать все символы, включая перевод строк, а на деле такое может только конструкция ([\r\n]|.) 
Ничего мутного?  smile  


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
_zorn_
Дата 12.3.2016, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: 6
Всего: 12



Цитата(ksnk @  12.3.2016,  18:30 Найти цитируемый пост)
Да ну? Тот факт, что точка НЕ может использоваться как элемент символьного класса не мутен?  

С чего бы это ? В симольном класе точка - и есть точка, а не любой символ. Хз что вы там себе наприбумывали....
Цитата(ksnk @  12.3.2016,  18:30 Найти цитируемый пост)
По идее, класс [\r\n.] д

Да нидолжно быть никаких "по идее" если хочешь разобраться.

В данном случае сделай
echo '\nOLOLO';
echo "\nOLOLO";
И попробуй разобраться

Цитата(ksnk @  12.3.2016,  18:30 Найти цитируемый пост)
Ничего мутного?  smile   

Прочитай про модификаторы... хотя бы жадности.
PM MAIL   Вверх
V0fka
Дата 14.3.2016, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(ksnk @  11.3.2016,  18:27 Найти цитируемый пост)
А на таких данных без вопросика сработает? 

Не работает. Не понимаю пока почему, буду разбираться smile 

_zorn_, по тому, что вы написали тоже пока ничего не понял. Помедитирую на досуге. smile
Пока отвечу на
Цитата(_zorn_ @  12.3.2016,  06:21 Найти цитируемый пост)
ЗЫ. А почему не htmlspecialchars ?

Есть wysiwyg редактор, который на выходе возвращает html. Этот html записывается в базу, а потом я его оттуда просто отображаю на страничке. Если сделать htmlspecialchars (я пробовал), тогда html отображается в виде текста. А тема эта появилась, потому что недавно я обнаружил, что какая-то сволота каким-то образом вставила javascript в базу. Это при том, что я как не пробовал, wysiwyg у меня скрипт зарезает. Поэтому я решил попробовать вырезать js код.

Допускаю, что так, как я сейчас пытаюсь решить эту проблему, из приличных людей никто так не делает. Если это так, то может быть подскажете, как делают?
PM MAIL   Вверх
ksnk
Дата 14.3.2016, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(V0fka @  14.3.2016,  10:39 Найти цитируемый пост)
Не работает. Не понимаю пока почему, буду разбираться  

Нужно почитать про `?`и "жадность". Своими словами - конструкция .* или .+ работает в 2 режимах - жадный и нежадный. В первом захватывается последняя подходящая конструкция, в последнем - первая. По умолчанию, конструкция с точкой - в жадном режиме, вопросик переключает эти режимы.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
V0fka
Дата 15.3.2016, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



ksnk, почитаю, спасибо! А подскажите, если можете, насчет
Цитата(V0fka @  14.3.2016,  10:39 Найти цитируемый пост)
Допускаю, что так, как я сейчас пытаюсь решить эту проблему, из приличных людей никто так не делает. Если это так, то может быть подскажете, как делают? 


PM MAIL   Вверх
ksnk
Дата 15.3.2016, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Сначала нужно описать саму проблему. Что за тексты, откуда они берутся,  кем написаны (скрипт, чужие люди, собственные админы) Зачем оттуда нужно выкидывать какие-то элементы? Только ли скрипты оттуда нужно выкидывать? Может еще и ифреймы и активные элементы?
После этого можно будет формулировать подходы к решению.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
V0fka
Дата 15.3.2016, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



ksnk, не не. Возможно вы подскажете как не допустить такого, в принципе. Выкидывать <script> это как костыль. Как я выше писал, есть wysiwyg редактор, из которого можно получить html разметку. Я её получаю и в том виде, как она есть, без htmlspecialchars и прочего пишу этот html в базу. Потом на определенной странице беру то, что я положил в базу ранее и просто, опять таки без какой-либо обработки, вывожу на страницу и получаю красиво размеченные сообщения. Вопрос в том, что так нормальные люди делают?

Это сообщение отредактировал(а) V0fka - 15.3.2016, 13:22
PM MAIL   Вверх
ksnk
Дата 15.3.2016, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Обычно, считается, что в базу попадает уже валидный и корректный код. Просто чтобы не делать обработку каждый раз при выводе. Таким образом проверку и обработку неплохо бы делать перед складированием в базу, сразу после визивига.

Самому писать всю эту чистку довольно заморочно. Есть готовые инструменты, которые все чистят, например http://htmlpurifier.org/ Но он страшно велик. С другой стороны еще и могуч...

Наткнулся на  MarkHtml -  https://habrahabr.ru/post/116607/ 
На первый взгляд - забавно и компактно, хотя сам и не пробовал.  


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
V0fka
Дата 17.3.2016, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



ksnk, попробую значит прикрутить MarkHtml и дополнительно буду медитировать над "жадностью" и "?".  Спасибо большое за помощь! smile 

_zorn_, вам так же спасибо за ответы!
PM MAIL   Вверх
V0fka
Дата 18.3.2016, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



ksnk, почитал про жадность, появилась пара вопросов smile . Я правильно понимаю, что /<script>.*?<\/script>/s можно записать как /<script>.*<\/script>/sU ?
Ещё читал, как вставлять модификаторы в шаблон, пишут, что вместо ? можно ещё указывать (?U). С ? удобнее, спору нет, но интереса ради я попробовал и с (?U): /<script>.*(?U)<\/script>/s. Но оно так не работает. Почему?

_zorn_, раскурил вашу регулярку. Вроде понял. Спасибо! И решетками обрамлять выражение, на первый взгляд, действительно удобнее.

Это сообщение отредактировал(а) V0fka - 18.3.2016, 13:46
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0973 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.