powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Нобелевская премия за регулярное выражение
31 сообщений из 31, показаны все 2 страниц
Нобелевская премия за регулярное выражение
    #38763867
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, имеется php-код:
Код: php
1.
2.
3.
4.
5.
6.
$var1 = "111'222";
$var2 = "333'444";
$var3 = '111"222';
$var4 = '333"444';
$var5 = '111\'222';  // ddd " "" 'rrr'ttt'
$var6 = "333\'444";


Необходимо регуляркой вытащить все строки.
Нобелевскую премию кто-нибудь хочет ?
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38763893
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

легко...ток надо ити хавать и домой с работы.

:) шучу...по большому щёту тут парсить надо пхп код полноценно, а то вдруг у тебя там вызовы функций есть, или ещо какие финты...

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

1 или 2
1 текст в одинарных кавычках
тоесть оиднарная(неодинарная ИЛИ одинарная перед которой стоит слеш)*одинарная

аналогично в двойных
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38763937
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

такие вещи делаются не регулярками.
при очень большом желании, можно накатать и регулярку. но она будет большая и не очень эффективная.
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38763944
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача решается только для некоторых типов строк:
Строка в одиночных кавычках: /\'(?:\\\'|[^\'])*\'/
Строка в двойных кавычках: /\"(?:\\\"|[^\"])*\"/
Строка вызова внешней программы: /\`[^\`]*\`/

А вот here-строки регуляркам не под силу...
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38763950
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпри очень большом желании, можно накатать и регулярку. но она будет большая и не очень эффективная.
Это на первый взгляд большая. Те регулярки, что я составил выше - совсем малюсенькие.
Но рассчитаны они на корректный php-код. Проверять корректность php-кода - это не уже не задача регулярок.
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38763959
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тьфу, про комментарии забыл. В комментах могут быть любые кавычки и в любой последовательности...
При этом предварительно удалить или замаскировать комментарии нельзя, поскольку последовательности //, /* и */ могут находиться внутри строк.

Вообще, сабжевая задача у меня как раз и возникла при обфускации php-кода. Чтобы удалить php-комментарии, необходимо вначале "замаскировать" все строки (внутри которых могут быть последовательности //, /* и */). А чтобы отобрать все строки, необходимо предварительно замаскировать все php-комментарии (внутри которых могут быть кавычки). Получаем deadlock . Нужен автомат.

P.S. В случае с html задача решается наура:
а) "маскируем" все CDATA и SCRIPT-фрагменты (внутри них могут быть html-комментарии, которые удалять не нужно)
б) удаляем html-комментарии
в) восстанавливаем CDATA и SCRIPT-фрагменты
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38763973
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Это на первый взгляд большая. Те регулярки, что я составил выше - совсем малюсенькие.
я понял что нужна одна общая регулярка.
а для частных случаев вообще проблем невижу.
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764005
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя понял что нужна одна общая регулярка.Всё равно небольшая:
/(?:\'(?:\\\'|[^\'])*\')|(?:\"(?:\\\"|[^\"])*\")|(?:\`[^\`]*\`)/

автора для частных случаев вообще проблем невижу.
А как Вы исключаете из отбора "строки" внутри комментариев ?
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764030
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА вот here-строки регуляркам не под силу... Всё-таки под силу:
/\<\<\<(?:?P<MARKER>\w+)[ \t]*(?:\n\r|\r\n|\n|\r)(?:\s\S?)(?:?P=MARKER)\;/

Правда, проверить эту регулярку негде. Здесь сайт умер (а ведь был лучшим в мире анализатором регулярок). Здесь парсер не понимает именованные группы...
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764046
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для сложных случаев наверняка можно посмотреть и взять готовые регулярки/алгоритмы в программах подсветки синтаксиса.
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764188
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Всё равно небольшая
ну вот сам себе премию и выплачивай)
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764214
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя

если вернуться к начальной задаче
Cyrax_02Необходимо регуляркой вытащить все строки.
про комментарии ничего не сказано(т.е. то что в них не является строками)

то решение простое
/(['"])(\\?.)+?\1;/g

если начать приплетать сюда различные виды комментариев и тд. то решение мое былобы другим. сначала вырезать весь мусор(типа комментов) а потом уже найти все строки. ибо это логично.
но это все лирика. придумывать на ходу можно много еще условий. так неинтересно. в итоге, начальная задача решена несколькими способами.

так что вопрос - как нобелевку делить будем? )
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764218
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r u,

да даже /(['"]).+?\1;/g хватит )
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764322
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\"(?:\\\"|[^\"])*\"/
это не правильная для двойных кавычек
ибо в тексте \P не пройдёт, это и не слеш с двойно, и не символы недвойнаяИнеслеш


в регулярках есть положительный просмотр вперёд.

вроде так
(?<=\\)" ----двойная кавычка перед которой стоит слеш
итого
/"((?:(?<=\\)")|[^\\"])*"/
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764326
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сори

/"((?:(?<=\\)")|[^"])*"/

и это положительный просмотр назад
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764330
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/"((?:(?:(?<=\\)")|[^"])*)"/
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38764390
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Допустим, имеется php-код:
Код: php
1.
2.
3.
4.
5.
6.
$var1 = "111'222";
$var2 = "333'444";
$var3 = '111"222';
$var4 = '333"444';
$var5 = '111\'222';  // ddd " "" 'rrr'ttt'
$var6 = "333\'444";


Необходимо регуляркой вытащить все строки.
Нобелевскую премию кто-нибудь хочет ?
Подкинем еще вариантов
Код: php
1.
$var7 = '555\\'; $var8 = '555\\\'666'; $var9='777\\\\'; $var0 = '888\\\\\'9999';
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38765296
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпро комментарии ничего не сказано(т.е. то что в них не является строками)
Вообще-то и про одиночные/двойные кавычки тоже ничего не сказано. Ирония: почему Вы придумываете дополнительные условия, что якобы строки должны быть заключены в одинарные или двойные кавычки ?

По существу: в условии прямо указано, что строки необходимо искать в php-коде. Следовательно:
а) строками признаются те, которые заключены в одинарные или двойные кавычки, либо подчиняются here-синтаксису
б) фрагменты, ограниченные кавычками и расположенные внутри php-комментариев, строками не являются

Мы ж не американцы, чтобы двойных стандартов придерживаться. Либо не А и не Б (задача не имеет смысла), либо и А, и Б.
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38766623
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор/(['"]).+?\1;/gЭта регулярка должна отбирать php-строки, заключенные в одинарные или двойные кавычки, так ?
Тогда зачем здесь точка с запятой ? И что это за модификатор - g ? В php таких вроде нет.

Кроме того, эта регулярка не предусматривает возможность указания кавычек внутри строки:
"...\"..." - вернёт "...\"
'...\'...' - вернёт '...\'

и не разрешает символов перехода на новую строку внутри строки (вместо точки нужно использовать [\s\S] или [.\n\r])

автор/"((?:(?:(?<=\\)")|[^"])*)"/ Этой регуляркой Вы вытаскиваете не php-представление строк (которое содержится в исходном php-коде), а содержимое строк, заключенных в двойные кавычки. Т.е. из "строка\"ещё строка" регулярка должна вернуть строка"ещё строка. Пусть будет так.

Но мне непонятно, почему эта регулярка не работает. Вернее, парсеру не нравится позитивная проверка слева (?<=\\)"). Если её убрать или переписать выражение так: "((?:(?:\\")|[^"])*)" - то всё работает. Проверяю здесь (ограничители и модификаторы в самом выражении не указываются).

Может, javascript позиционные проверки вообще не поддерживает ?
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38766627
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДля сложных случаев наверняка можно посмотреть и взять готовые регулярки/алгоритмы в программах подсветки синтаксиса. Не получится. Потому что зависит это от языка, на котором написана эта программа и диалекта регулярных выражений, который поддерживает этот язык. Нужен именно php-диалект.

Не могу найти тестер pcre-выражений на php. Единственный из таких, который я знал, - www.regexpr.ru (регулярка выполнялась на сервере в php и результат был очень информативный), но этот сайт перестал работать. Все прочие подобные сайты - говно ужас, да и выполняются регулярки на клиенте (javascript).
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38766844
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02автор/"((?:(?:(?<=\\)")|[^"])*)"/ Этой регуляркой Вы вытаскиваете не php-представление строк (которое содержится в исходном php-коде), а содержимое строк, заключенных в двойные кавычки. Т.е. из "строка\"ещё строка" регулярка должна вернуть строка"ещё строка. Пусть будет так.Ваша регулярка имеет логическую ошибку. Для строки "строка\"ещё строка":
а) php-представление строки (которое содержится в исходном php-коде) имеет вид: "строка\"ещё строка"
б) внутреннее содержимое строки имеет вид: строка"ещё строка

Так вот, Ваша регулярка вовращает строка\"ещё строка. Ни рыба - ни мясо.
А почему Ваша регулярка захватывает также и бэкслэш - потому что он удовлетворяет второму альтернативному односимвольному фрагменту: [^"]. Т.е. позитивная проверка слева здесь погоды не делает.

Да и вообще, Вы считаете, что регуляркой можно выделить из исходной строки фрагмент с удалением из этого фрагмента некоторого символа (в данном случае бэкслеша) ? Это невозможно . Даже применяя позиционные проверки.
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38766905
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот упрощённое решение сабжевой задачи (пока без учёта комментариев):
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 "паразитные" группы.
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38767216
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02,

непашет
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38767396
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ха. А Вы проверяли, что содержится внутри строки ? Чтобы эту регулярку запихать в строку, нужно правильно слэши расставить.
Покажите Ваш проверочный код. Где и как Вы проверяете ? Не в javascript ли случаем ?
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38767465
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02нужно правильно слэши расставить.
сам слеши расставить не можешь чтоли?)
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38767467
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Cyrax_02Ха. А Вы проверяли, что содержится внутри строки ? Чтобы эту регулярку запихать в строку, нужно правильно слэши расставить.
Покажите Ваш проверочный код. Где и как Вы проверяете ? Не в javascript ли случаем ?
Я проверял
Код: php
1.
2.
3.
4.
$reg = "/\\'(?:\\\\\\'|[^\\'])*\\'/";
$code = '$a = \'555\\\\\'; $b = \'555\\\\\\\'666\';';
preg_match_all($reg,$code,$match);
var_dump($reg,$code,$match);


Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
string(21) "/\'(?:\\\'|[^\'])*\'/"
string(32) "$a = '555\\'; $b = '555\\\'666';"
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(15) "'555\\'; $b = '"
    [1]=>
    string(5) "'666'"
  }
}
Правильно слеши расставлены?
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38767714
Cyrax_02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПравильно слеши расставлены? Неправильно. Нужно вот так:
Код: php
1.
$reg = '/\\\'(?:\\\\\\\'|\\\\\\\\|[^\\\'])*\\\'/';


И будет счастье:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
Array
(
    [0] => Array
        (
            [0] => '555\\'
            [1] => '555\\\'666'
        )

)
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38767735
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02, а универсальную регулярку то как сделать? А то я в $code по паре слешиков добавил - и оно опять сломалось
Код: php
1.
$code = '$a = \'555\\\\\\\'; $b = \'555\\\\\\\\\'666\';';
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38767741
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, нет, вру... Это у меня неправильная строка получилась...
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38767768
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cyrax_02Неправильно. Нужно вот так:
так это совсем другая регулярка
...
Рейтинг: 0 / 0
Нобелевская премия за регулярное выражение
    #38767795
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вложенное в несколько уровней экранирование слешами взрывает мозг :)
Со строкой в кавычках будет хуже - там экранировать можно не только слеш и кавычку
Код: php
1.
$var = "t\123u\x48v\11w\xax\\y\"z";
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Нобелевская премия за регулярное выражение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]