Regex для получения содержимого между одиночными и двойными кавычками php

У меня есть код вроде:

preg_match_all(UNKNOWN, "I need \"this\" and 'this'", $matches) 

Мне нужен REGEX, для которого $matches match возвращает только две записи «this» без кавычек.

Solutions Collecting From Web of "Regex для получения содержимого между одиночными и двойными кавычками php"

Я думаю, что следующее должно работать:

 $str = 'I need "this" and \'this\''; if (preg_match_all('~(["\'])([^"\']+)\1~', $str, $arr)) print_r($arr[2]); 

ВЫВОД:

 Array ( [0] => this [1] => this ) 
 preg_match_all('/"(.*?)".*?\'(.*?)\'/', "I need \"this\" and 'this'", $matches); 

Но обратите внимание, что порядок цитируемых строк имеет значение здесь, так что этот будет фиксироваться ТОЛЬКО, если там указаны обе цитируемые строки (одиночные и двойные) И они находятся в этом порядке (дважды – первая, одна – вторая).

Чтобы захватить каждую из них по отдельности, я запускаю preg_match дважды с каждым типом котировок.

 preg_match_all("/(this).*?(this)/", "I need \"this\" and 'this'", $matches) 

или если вы хотите, чтобы текст между кавычками

 preg_match_all("/\"([^\"]*?)\".*?'([^']*?)'/", "I need \"this\" and 'this'", $matches) 

Вы можете уменьшить этот ответ так, как хотите, но в некоторых случаях вы можете сделать:

 $str = "I need \"this\" and 'this'"; $str = str_replace('\'','"',$str); $arr = explode('"',$str); foreach($arr as $key => $value) if(!($key&1)) unset($arr[$key]); print_R($arr); 

Так пусть это будет и в ответах.

Вот одно из решений:

 preg_match_all('/(["\'])([^"\']+)\1/', "I need "this" and 'this'", $matches) 

Это требует, чтобы кавычка открытия и закрытия была одинаковой, и что между ними нет кавычек. Результаты, которые вы хотите, войдут во вторую группу захвата.

Чтобы сделать регулярное выражение максимально надежным, ограничьте его, насколько это возможно. Если эта часть регулярного выражения может содержать только буквы, вместо этого используйте что-то вроде [az]+ (возможно, с нечувствительностью к регистру).

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

 preg_match("~^(?:[\s\S]*)?(?:(?:\"([\s\S]+)\")|(?:'([\s\S]+)'))(?:[\s\S]*)?(?:(?:\"([\s\S]+)\")|(?:'([\s\S]+)'))(?:[\s\S]+)?$~", "some \"text in double quotes\" and more 'text to grab' here", $matches); $matches[1]; // "text in double quotes"; $matches[2]; // "text to grab" 

Это будет соответствовать всем перечисленным ниже:

 Some "text in double quote" and more in "double quotes" here. "Double quoted text" and 'single quoted text'. "Two" "Doubles" 'Two' 'singles' 

Вы можете увидеть его в действии здесь, в Regex101: https://regex101.com/r/XAsewv/2