Intereting Posts
ZF2 + Doctrine2 – Fieldset в Fieldset коллекции в Fieldset не проверяется правильно Magento получает изображения продукта в корзине покупок как отлаживать javascript на хром Как игнорировать случай при анализе с помощью simplexml? после того, как функция jquery вызова ajax не работает должным образом Как правильно использовать print_r или var_dump? Почему я не могу получить полный путь к ресурсу CSS в шаблоне клинка? Преобразование даты Из одного формата в другой Composer throws Класс Fxp \ Composer \ AssetPlugin \ Repository \ NpmRepository не существует Как загрузить изображение на CodeIgniter и отобразить его на другой странице Как объединить прозрачный PNG с изображением с помощью PHP? Вход в PHP и получение информации о пользователе Допустимый размер памяти 268435456 байт исчерпан Как добиться такого же поведения в Ajax Laravel 5.3: Внедрение паспортов – {"error": "invalid_client", "message": "Ошибка аутентификации клиента}}

Регулярное выражение PHP с круглыми скобками

У меня строка ниже:

test 13 (8) end 12 (14:48 IN 1ST) 

Мне нужен вывод:

 14:48 IN 1ST 

или все внутри скобок в конце строки.

Мне не нужно, 8, который находится внутри первого набора круглых скобок. В строке может быть несколько наборов круглых скобок. Мне нужно только рассмотреть все внутри последнего набора круглых скобок входной строки.

Related of "Регулярное выражение PHP с круглыми скобками"

Regex Пояснение

 .* Go to last \( Stars with ( ([^)]*) 0 or more character except ) \) Ends with 

preg_match

 $str = "test 13 (8) end 12 () (14:48 IN 1ST) asd"; $regex = "/.*\(([^)]*)\)/"; preg_match($regex,$str,$matches); $matches array ( 0 => 'test 13 (8) end 12 () (14:48 IN 1ST)', 1 => '14:48 IN 1ST', ) 

Принять Пустой preg_match_all

 $str = "test 13 (8) end 12 () (14:48 IN 1ST) asd"; $regex = "/\(([^)]*)\)/"; preg_match_all($regex,$str,$matches); $matches array ( 0 => array ( 0 => '(8)', 1 => '()', 2 => '(14:48 IN 1ST)', ), 1 => array ( 0 => '8', 1 => '', 2 => '14:48 IN 1ST', ), ) 

Не принимать пустые preg_match_all

 $str = "test 13 (8) end 12 () (14:48 IN 1ST) asd"; $regex = "/\(([^)]+)\)/"; preg_match_all($regex,$str,$matches); $matches array ( 0 => array ( 0 => '(8)', 1 => '(14:48 IN 1ST)', ), 1 => array ( 0 => '8', 1 => '14:48 IN 1ST', ), ) 

Я бы не использовал для этого регулярное выражение, это не нужно.

Используйте strrpos и substr, чтобы извлечь нужную строку. Это просто, прямолинейно и обеспечивает желаемый результат.

Он работает путем нахождения последнего '(' в строке и удаления одного символа из конца строки.

 $str = "test 13 (8) end 12 (14:48 IN 1ST)"; echo substr( $str, strrpos( $str, '(') + 1, -1); $str = "(dont want to capture the (8)) test 13 (8) end 12 (14:48 IN 1ST)"; echo substr( $str, strrpos( $str, '(') + 1, -1); 

демонстрация

Изменить: Следует также отметить, что мое решение будет работать для всех следующих случаев:

  1. Пустые круглые скобки
  2. Один набор скобок (т.е. строка перед желаемой группировкой не содержит скобок)
  3. Более трех наборов круглых скобок (если желаемая группировка находится в конце строки)
  4. Любой текст, следующий за последней скобкой (в соответствии с изменениями ниже)

Заключительное редактирование. Опять же, я не могу выделить достаточно, чтобы использовать регулярное выражение для этого не нужно. Вот пример, показывающий, что манипуляция строк в 3x – 7x быстрее, чем при использовании регулярного выражения .

Согласно комментариям MetaEd, мой пример / код можно легко изменить, чтобы игнорировать текст после последней скобки.

 $str = "test 13 (8) end 12 (14:48 IN 1ST) fkjdsafjdsa"; $beginning = substr( $str, strrpos( $str, '(') + 1); substr( $beginning, 0, strpos( $beginning, ')')) . "\n"; 

STILL быстрее, чем регулярное выражение .

Я бы пошел со следующим регулярным выражением:

 .*\(([^)]+)\) 

\(.*\) будет соответствовать первому и последнему параметрам. Чтобы этого не случилось, начните с .* , Который будет жадно потреблять все до окончательного открытого пара. Затем поместите группу захвата вокруг того, что вы хотите вывести, и у вас есть:

 .*\((.*)\) 

Это регулярное выражение будет делать:. .+\((.+?)\)$

Выйдите из круглых скобок, сделайте + не-жадный с? И убедитесь, что он находится в конце строки.

Если после него могут быть символы, попробуйте это вместо:

 .\).+\((.+?)\) 

Что в основном гарантирует, что будут совпадать только с вторыми круглыми скобками. Я бы предпочел первый.

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

[edit] (чтобы люди, которые любят проголосовать за вещи, прежде чем понимать то, что говорится … (например, СП), могут иметь реальный код для рассмотрения) …

 "test 13 (8) end 12 (14:48 IN 1ST)".split( /)/); 

Это создаст массив с двумя элементами … "test 13 (8" и "end 12 (14:48 IN 1ST"

Обратите внимание, что независимо от того, сколько у вас (xyz), у вас есть, вы получите последнее в последнем элементе массива.

Затем вы просто просматриваете этот последний элемент для '(', и если он там захватит все за ним.

Я подозреваю, что это будет работать быстрее, чем прямой подход с регулярным выражением, но я не тестировал, поэтому не могу гарантировать, что … независимо от того, работает ли он. [/редактировать]