У меня строка ниже:
test 13 (8) end 12 (14:48 IN 1ST)
Мне нужен вывод:
14:48 IN 1ST
или все внутри скобок в конце строки.
Мне не нужно, 8, который находится внутри первого набора круглых скобок. В строке может быть несколько наборов круглых скобок. Мне нужно только рассмотреть все внутри последнего набора круглых скобок входной строки.
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);
демонстрация
Изменить: Следует также отметить, что мое решение будет работать для всех следующих случаев:
Заключительное редактирование. Опять же, я не могу выделить достаточно, чтобы использовать регулярное выражение для этого не нужно. Вот пример, показывающий, что манипуляция строк в 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), у вас есть, вы получите последнее в последнем элементе массива.
Затем вы просто просматриваете этот последний элемент для '(', и если он там захватит все за ним.
Я подозреваю, что это будет работать быстрее, чем прямой подход с регулярным выражением, но я не тестировал, поэтому не могу гарантировать, что … независимо от того, работает ли он. [/редактировать]