Как заменить строку, которая начинается с «[id», имеет неизвестную среднюю часть и заканчивается на «]»? - PullRequest
3 голосов
/ 30 сентября 2010

Я хотел бы заменить строки, начинающиеся с "[id", средняя часть которых неизвестна и оканчивается на "]" в тексте $.Я знаю, как заменить строки, которые начинаются с «[id» и заканчиваются на «]», но я не могу понять, как включить неизвестную среднюю часть тела в качестве правила замены.

Любые идеи, какзаменить как это?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 30 сентября 2010

Следующее удалит все вхождения [id что-то ]. что-то будет соответствовать всем символам, кроме ].

$newText = preg_replace('#\[id[^\]]+\]#', '', $subject);

Если вы знаете, что что-то всегда является цифрой, вы можете использовать что-то вроде этого:

$newText = preg_replace('#\[id\d+\]#', '', $subject);

Для получения дополнительной информации о регулярных выражениях см. Этот веб-сайт: http://www.regular -expressions.info / .

4 голосов
/ 30 сентября 2010

Функции замены строк могут работать только на определенных строках. Если у вас есть шаблон , который вы хотите сопоставить, вы должны использовать 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=...]).

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

2 голосов
/ 30 сентября 2010

с использованием preg_replace():

<?php

    $text = "[hi=hello] [id=hellomynameisjoe] [hello=hi]";
    $new = preg_replace('@\[id[^\]]+\]@', '[replaced!]', $text);
    echo $new;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...