Intereting Posts
Что такое функция обратного вызова и как использовать ее с OOP Почему завершение кода Eclipse не работает над некоторыми проектами? PHP: Как пропущены комментарии? PHP: Разделите бизнес-логику и презентационную логику, стоит ли это? Какая лучшая передача функций – переменные или массивы / объекты? Heroku не распознает мое приложение Laravel как приложение PHP и не выполняет установку композитора HashMap через SOAP с Java на PHP и обратно Доступ к нестатистическому свойству из статического метода Являются ли PHP preg_functions многобилетными безопасными? PayPal Adaptive Payments IMPLICIT Pay API Включить PHP-файл с помощью jQuery или Javascript Как получить идентификатор кнопки типа отправки, когда нажата кнопка (PHP + HTML) Изменение размера изображений с помощью PHP, поддержка PNG, JPG Глубокие (бесконечные) разделенные слова с использованием регулярного выражения Кто-то взломал мою базу данных – как?

Получение текста между кавычками с использованием регулярного выражения

У меня возникают некоторые проблемы с регулярным выражением, которое я создаю.

Мне нужно регулярное выражение для сопоставления с приведенными ниже примерами, а затем совпадение в первой цитируемой строке:

Строки ввода

("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ')

('Lorem ipsum dolor sit amet, consectetur adipiscing elit. ', 'arg1', "arg2")

Должен совпадать

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Regex пока:

\((["'])([^"']+)\1,?.*\)

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

Это почти отлично работает, но проблема заключается в том, что если строка с кавычками содержит кавычки в тексте, то совпадение останавливается в первом экземпляре, см. Ниже:

Неисправность входных строк

("Lorem ipsum dolor \"sit\" amet, consectetur adipiscing elit.")

Только вспомогательные спички: Lorem ipsum dolor

("Lorem ipsum dolor 'sit' amet, consectetur adipiscing elit.")

Весь матч терпит неудачу.

Заметки

Входные строки – это фактически вызовы функций кода php. Я пишу скрипт, который сканирует исходные файлы .php для конкретной функции и захватывает текст из первого параметра.

Попробуйте это регулярное выражение:

 \(\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*')(?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))*\s*\) 

Некоторое объяснение:

  • \(\s\* соответствует открывающей скобке и необязательному пробелу.
  • (?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*') соответствует любой кавычки, разрешающей котировку символа только при сбегании с \ .
  • (?:\s*,\s*(?:"(?:[^"\\]+|\\.)*"|'(?:[^'\\]+|\\.)*'))* описывает ноль или более строк кавычек, которым предшествует a , которому может предшествовать пробел.
  • \s*\) соответствует закрывающей скобке с дополнительным пробелом.

убедитесь, что не совпадают с цитатой, когда она сбежала (перед ней обратная косая черта):

 /\((["'])([^"']+)[^\\]\1,?.*?\)/