Функции замены строк могут работать только на определенных строках. Если у вас есть шаблон , который вы хотите сопоставить, вы должны использовать preg_replace
, который заменяет на основе регулярных выражений:
$text = preg_replace('/\[id[^\]]*\]/', $replacement, $text)
// $replacement is whatever string you want to replace with
/\[id[^\]]*\]/
- это регулярное выражение (он же regex ). Косые черты на каждом конце - это разделители , которые необходимы PHP для определения регулярного выражения. Остальная часть шаблона может быть описана следующим образом:
\[ # match a literal [ character
id # match the string "id"
[^ # open a negated character class
\] # match anything other than literal ] character (since it's in a negated class)
]* # close the class, repeat it zero or more times
\] # match a literal ]
Concepts:
- Классы символов - класс символов - это способ описания того, что символ может быть одной из ряда возможностей. Классы персонажей начинаются с
[
и заканчиваются ]
. Например, [abc]
соответствует a
или b
или c
. Классы символов могут быть отрицаться , если первый символ в классе ^
: [^abc]
соответствует любому символу, который не a
или b
или c
. В нашем шаблоне [^\]]
соответствует любому символу, который не ]
. Обратите внимание, что ]
внутри класса должно быть экранированным , потому что ]
обычно означает конец класса, но мы хотим указать буквальный символ ]
.
- Повтор с использованием
*
- Части шаблонов могут повторяться (что позволяет шаблону указывать, что что-то может появляться несколько раз). Существует три оператора повторения: ?
указывает, что что-то может появляться ноль или один раз (т. Е. Это делает часть вашего шаблона необязательным ); *
указывает, что что-то может появляться ноль или более раз (т. Е. Это может быть необязательным, но может также любое количество раз) +
указывает на то, что должно появиться хотя бы один раз.
В нашем случае; [^\]]*
указывает, что символ, который не является ]
, может совпадать ноль или более раз - это будет соответствовать пустой строке или abcdefg
, так как класс отрицанных символов соответствует 7 раз (поскольку каждый символ не ]
).
Обратите внимание, что по умолчанию регулярными выражениями являются жадные , что означает, что они будут соответствовать как можно большей части строки; по этой причине [^\]]*
при сопоставлении с abcdefg
будет соответствовать всей строке, поскольку это наибольшее совпадение, которое она может выполнить (даже если меньшие подстроки соответствуют шаблону).
- Все остальное в этом шаблоне соответствует буквально. Как мы видели выше,
[
и ]
необходимо экранировать для соответствия буквенным символам - потому что они имеют значение в регулярном выражении (то есть для определения класса символов) - но id
соответствует i
, за которым сразу следует на d
.
Когда вы сложите все это вместе, вы получите шаблон, который соответствует открывающей скобке, за которой следуют буквы id
, затем ноль или более символов и затем закрывающая скобка.
Обратите внимание: если вы хотите сделать этот шаблон без учета регистра, вы можете добавить i
после последней косой черты: /\[id[^\]]*\]/i
. /i
- это модификатор , который делает нечувствительным к регистру весь шаблон (таким образом, он также будет соответствовать [ID=...]
).
Я рекомендую прочитать учебник на сайте регулярных выражений, если вы не знакомы с регулярными выражениями, поскольку это даст вам очень хорошее понимание того, что они делают и как их составлять.