У меня есть текст вроде:
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
).
[
и ]
специальные символы, поэтому вам нужно их избежать:
\[*.?\]