PHP хитрое регулярное выражение, чтобы получить строку в кавычках до определенных слов - PullRequest
1 голос
/ 27 марта 2020

У меня есть вариант строк, которые выглядят так:

First rounder 'John Smith' had a good game.

Second rounder 'Jim O'Rielly' is on fire!

В конечном итоге я хочу получить оба имени между кавычками John Smith и Jim O'Rielly, однако сложная часть состоит из имен которые включают апостроф, как второй.

Я изначально использовал '/\'([^\']*)\'/', чтобы получить текст внутри кавычек, но не работает для второго случая - это вернуло бы только Jim O.

Затем я подумал использовать .+?(?=had), чтобы привести все к слову had, но оно должно быть либо had, либо is, и мне не нужны слова First rounder и т. Д. c.

Мне нужно по существу объединить их, чтобы я мог получить только текст внутри кавычек, но ВВЕРХ ДО слова had или is, и я просто хочу текст без кавычек.

Если не существует хитрости, позволяющей получить второй вариант, игнорирующий апостроф в имени (я думал добавить addSlashes (), но как узнать, к какому апострофу следует добавить косую черту?), Кто-нибудь может предложить лучшее решение это ? Бонусные баллы за игнорирование любых специальных символов, которые я не рассматриваю, могут быть найдены в имени:)

Ответы [ 2 ]

2 голосов
/ 27 марта 2020

Вы можете чередовать совпадения, отличные от ' s, и совпадения ' s , в которых по обеим сторонам есть символы слова . Таким образом, ' с в середине слова будут совпадать, но ' с на обоих концах слова не будут.

'((?:[^']+|\b'\b)+)'

https://regex101.com/r/L9Em5l/1

1 голос
/ 27 марта 2020

Другой вариант может соответствовать любому символу, кроме ', используя класс отрицательных символов .

Тогда принимайте совпадение только с ', если за ним следует граница слова, и повторяйте это 0+, чтобы оно было необязательным, а также совпадение имени без единой кавычки.

'([^']+(?:'\b[^']++)*)'

Объяснение

  • '( Начало матча ' и открытый захват группа 1
    • [^']+ Матч 1+ раз с любым символом кроме '
    • (?: группа без захвата
      • '\b[^']++ совпадение ' и граница слова, совпадение 1+ раз с любым символом, кроме ', с использованием собственнического квантификатора
    • )* Закройте группу и повторите 0+ раз, так что это будет необязательно
  • )' Закройте группу 1 и сопоставьте закрывающий '

Демонстрация регулярных выражений

Если вы не хотите, чтобы класс отрицанных символов соответствовал символам новой строки, вместо этого вы можете использовать [^'\r\n]+.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...