Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Допустим, имеется php-код: Код: php 1. 2. 3. 4. 5. 6. Необходимо регуляркой вытащить все строки. Нобелевскую премию кто-нибудь хочет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 18:56 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, легко...ток надо ити хавать и домой с работы. :) шучу...по большому щёту тут парсить надо пхп код полноценно, а то вдруг у тебя там вызовы функций есть, или ещо какие финты... если речь идёт о опознаем строку нужную по долларбуквабуквыцыфры пробельный равно пробельный и вотом составить определение строки...то через или секцию 1 или 2 1 текст в одинарных кавычках тоесть оиднарная(неодинарная ИЛИ одинарная перед которой стоит слеш)*одинарная аналогично в двойных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 19:21 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, такие вещи делаются не регулярками. при очень большом желании, можно накатать и регулярку. но она будет большая и не очень эффективная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 20:08 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Задача решается только для некоторых типов строк: Строка в одиночных кавычках: /\'(?:\\\'|[^\'])*\'/ Строка в двойных кавычках: /\"(?:\\\"|[^\"])*\"/ Строка вызова внешней программы: /\`[^\`]*\`/ А вот here-строки регуляркам не под силу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 20:16 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
авторпри очень большом желании, можно накатать и регулярку. но она будет большая и не очень эффективная. Это на первый взгляд большая. Те регулярки, что я составил выше - совсем малюсенькие. Но рассчитаны они на корректный php-код. Проверять корректность php-кода - это не уже не задача регулярок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 20:18 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Тьфу, про комментарии забыл. В комментах могут быть любые кавычки и в любой последовательности... При этом предварительно удалить или замаскировать комментарии нельзя, поскольку последовательности //, /* и */ могут находиться внутри строк. Вообще, сабжевая задача у меня как раз и возникла при обфускации php-кода. Чтобы удалить php-комментарии, необходимо вначале "замаскировать" все строки (внутри которых могут быть последовательности //, /* и */). А чтобы отобрать все строки, необходимо предварительно замаскировать все php-комментарии (внутри которых могут быть кавычки). Получаем deadlock . Нужен автомат. P.S. В случае с html задача решается наура: а) "маскируем" все CDATA и SCRIPT-фрагменты (внутри них могут быть html-комментарии, которые удалять не нужно) б) удаляем html-комментарии в) восстанавливаем CDATA и SCRIPT-фрагменты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 20:28 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Это на первый взгляд большая. Те регулярки, что я составил выше - совсем малюсенькие. я понял что нужна одна общая регулярка. а для частных случаев вообще проблем невижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 20:40 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
авторя понял что нужна одна общая регулярка.Всё равно небольшая: /(?:\'(?:\\\'|[^\'])*\')|(?:\"(?:\\\"|[^\"])*\")|(?:\`[^\`]*\`)/ автора для частных случаев вообще проблем невижу. А как Вы исключаете из отбора "строки" внутри комментариев ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 21:22 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
авторА вот here-строки регуляркам не под силу... Всё-таки под силу: /\<\<\<(?:?P<MARKER>\w+)[ \t]*(?:\n\r|\r\n|\n|\r)(?:\s\S?)(?:?P=MARKER)\;/ Правда, проверить эту регулярку негде. Здесь сайт умер (а ведь был лучшим в мире анализатором регулярок). Здесь парсер не понимает именованные группы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 21:42 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Для сложных случаев наверняка можно посмотреть и взять готовые регулярки/алгоритмы в программах подсветки синтаксиса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2014, 22:17 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Всё равно небольшая ну вот сам себе премию и выплачивай) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 05:34 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
хотя если вернуться к начальной задаче Cyrax_02Необходимо регуляркой вытащить все строки. про комментарии ничего не сказано(т.е. то что в них не является строками) то решение простое /(['"])(\\?.)+?\1;/g если начать приплетать сюда различные виды комментариев и тд. то решение мое былобы другим. сначала вырезать весь мусор(типа комментов) а потом уже найти все строки. ибо это логично. но это все лирика. придумывать на ходу можно много еще условий. так неинтересно. в итоге, начальная задача решена несколькими способами. так что вопрос - как нобелевку делить будем? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 07:36 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
r u, да даже /(['"]).+?\1;/g хватит ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 07:41 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
/\"(?:\\\"|[^\"])*\"/ это не правильная для двойных кавычек ибо в тексте \P не пройдёт, это и не слеш с двойно, и не символы недвойнаяИнеслеш в регулярках есть положительный просмотр вперёд. вроде так (?<=\\)" ----двойная кавычка перед которой стоит слеш итого /"((?:(?<=\\)")|[^\\"])*"/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 09:46 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
сори /"((?:(?<=\\)")|[^"])*"/ и это положительный просмотр назад ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 09:47 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
/"((?:(?:(?<=\\)")|[^"])*)"/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 09:48 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02Допустим, имеется php-код: Код: php 1. 2. 3. 4. 5. 6. Необходимо регуляркой вытащить все строки. Нобелевскую премию кто-нибудь хочет ? Подкинем еще вариантов Код: php 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 10:32 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
авторпро комментарии ничего не сказано(т.е. то что в них не является строками) Вообще-то и про одиночные/двойные кавычки тоже ничего не сказано. Ирония: почему Вы придумываете дополнительные условия, что якобы строки должны быть заключены в одинарные или двойные кавычки ? По существу: в условии прямо указано, что строки необходимо искать в php-коде. Следовательно: а) строками признаются те, которые заключены в одинарные или двойные кавычки, либо подчиняются here-синтаксису б) фрагменты, ограниченные кавычками и расположенные внутри php-комментариев, строками не являются Мы ж не американцы, чтобы двойных стандартов придерживаться. Либо не А и не Б (задача не имеет смысла), либо и А, и Б. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2014, 18:49 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
автор/(['"]).+?\1;/gЭта регулярка должна отбирать php-строки, заключенные в одинарные или двойные кавычки, так ? Тогда зачем здесь точка с запятой ? И что это за модификатор - g ? В php таких вроде нет. Кроме того, эта регулярка не предусматривает возможность указания кавычек внутри строки: "...\"..." - вернёт "...\" '...\'...' - вернёт '...\' и не разрешает символов перехода на новую строку внутри строки (вместо точки нужно использовать [\s\S] или [.\n\r]) автор/"((?:(?:(?<=\\)")|[^"])*)"/ Этой регуляркой Вы вытаскиваете не php-представление строк (которое содержится в исходном php-коде), а содержимое строк, заключенных в двойные кавычки. Т.е. из "строка\"ещё строка" регулярка должна вернуть строка"ещё строка. Пусть будет так. Но мне непонятно, почему эта регулярка не работает. Вернее, парсеру не нравится позитивная проверка слева (?<=\\)"). Если её убрать или переписать выражение так: "((?:(?:\\")|[^"])*)" - то всё работает. Проверяю здесь (ограничители и модификаторы в самом выражении не указываются). Может, javascript позиционные проверки вообще не поддерживает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 20:29 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
авторДля сложных случаев наверняка можно посмотреть и взять готовые регулярки/алгоритмы в программах подсветки синтаксиса. Не получится. Потому что зависит это от языка, на котором написана эта программа и диалекта регулярных выражений, который поддерживает этот язык. Нужен именно php-диалект. Не могу найти тестер pcre-выражений на php. Единственный из таких, который я знал, - www.regexpr.ru (регулярка выполнялась на сервере в php и результат был очень информативный), но этот сайт перестал работать. Все прочие подобные сайты - говно ужас, да и выполняются регулярки на клиенте (javascript). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2014, 20:36 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02автор/"((?:(?:(?<=\\)")|[^"])*)"/ Этой регуляркой Вы вытаскиваете не php-представление строк (которое содержится в исходном php-коде), а содержимое строк, заключенных в двойные кавычки. Т.е. из "строка\"ещё строка" регулярка должна вернуть строка"ещё строка. Пусть будет так.Ваша регулярка имеет логическую ошибку. Для строки "строка\"ещё строка": а) php-представление строки (которое содержится в исходном php-коде) имеет вид: "строка\"ещё строка" б) внутреннее содержимое строки имеет вид: строка"ещё строка Так вот, Ваша регулярка вовращает строка\"ещё строка. Ни рыба - ни мясо. А почему Ваша регулярка захватывает также и бэкслэш - потому что он удовлетворяет второму альтернативному односимвольному фрагменту: [^"]. Т.е. позитивная проверка слева здесь погоды не делает. Да и вообще, Вы считаете, что регуляркой можно выделить из исходной строки фрагмент с удалением из этого фрагмента некоторого символа (в данном случае бэкслеша) ? Это невозможно . Даже применяя позиционные проверки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2014, 12:44 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Вот упрощённое решение сабжевой задачи (пока без учёта комментариев): 1) Строка в одиночных кавычках: /\'(?:\\\'|[^\'])*\'/ 2) Строка в двойных кавычках: /\"(?:\\\"|[^\"])*\"/ 3) Строка вызова внешней программы: /\`[^\`]*\`/ 4) HERE-строка: /\<\<\<(?P<MARKER>\w+)[ \t]*(?P<NL>\n\r|\r\n|\n|\r)(?:[\s\S]*?)(?P=NL)(?P=MARKER)\;/ Общее выражение: /(?:\'(?:\\\'|[^\'])*\')|(?:\"(?:\\\"|[^\"])*\")|(?:\`[^\`]*\`)|\<\<\<(?P<MARKER>\w+)[ \t]*(?P<NL>\n\r|\r\n|\n|\r)(?:[\s\S]*?)(?P=NL)(?P=MARKER)\;/ P.S. Жаль, что группы, генерирующие обратные ссылки , не могут быть НЕзахватывающими. Как следствие, регулярка порождает 4 "паразитные" группы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2014, 15:24 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Cyrax_02, непашет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2014, 15:31 |
|
||
|
Нобелевская премия за регулярное выражение
|
|||
|---|---|---|---|
|
#18+
Ха. А Вы проверяли, что содержится внутри строки ? Чтобы эту регулярку запихать в строку, нужно правильно слэши расставить. Покажите Ваш проверочный код. Где и как Вы проверяете ? Не в javascript ли случаем ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2014, 22:07 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=38767216&tid=1462362]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 399ms |

| 0 / 0 |
