Соответствует тексту внутри скобок с помощью Regex в PHP

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

name: [my_name] email: [my_email] 

Я хотел бы захватить поля в квадратных скобках с регулярным выражением – как бы я это сделал? Я попытался использовать этот шаблон: [*.?]

К сожалению, это не сработает. PHP дает эту ошибку:

 compilation failed: nothing to repeat at offset 0 

Что не так? Правильно ли шаблон?

Скобки являются специальными символами в регулярном выражении. Чтобы соответствовать им, вам придется избегать их с помощью обратной косой черты. Что-то вроде \[(.*?)\] . Добавление parens () фиксирует все, что соответствует ему, поэтому вы можете использовать его позже. В противном случае вы просто соответствуете всему шаблону, и вам придется вручную разбить скобки.

Вы должны переместить * и выйти из [и]. Так сделайте это \[.*\] Так как. соответствует любому символу уже и * говорит: 0 или более этого символа. Итак. * Равно 0 или больше любого символа

Нет, у вас неправильный порядок. Это должно быть что-то вроде

 \[(.*)\] 

. * = Что-то повторяется как можно чаще.

Ошибка компиляции, которую вы получаете, заключается в том, что компилятор теперь не повторяет, как [является специальным символом в регулярных выражениях. ? вы добавили, также не допустили бы ничего в скобках, и я решил, что вы этого не хотите, поэтому я удалил его. Значок вопроса делает вышеупомянутое заявление необязательным. Круглые скобки aroudn .* Используются для захвата результата. Если вы не добавите их, регулярное выражение будет соответствовать, но вы не получите то, что находится внутри скобок в качестве результата.

 <?php $text = "name: [my_name] email: [my_email]"; $pattern = '/\[(.*)\]/'; $matches = array(); preg_match_all($pattern, $text, $matches); $name = $matches[1][0]; $email = $matches[1][1]; print "$name<br />"; print "$email"; ?> 

выйдет

 my_name my_email 

/ является разделителем (не являющимся частью фактического шаблона как такового). \ Is для экранирования скобок [ и ] , поскольку они определяют определения классов символов в шаблонах, когда они не экранированы. ( и ) определяют подшаблоны, что означает, что текст, захваченный подшаблоном, будет помещен в массив, на который ссылается третий параметр preg_match_all (в этом случае $matches ).

Побег!

[ и ] специальные символы, поэтому вам нужно их избежать:

 \[*.?\]