соответствие либо ничего (начало строки), либо любой символ, кроме \ - PullRequest
1 голос
/ 12 февраля 2012

Чтобы использовать упрощенный пример, у меня есть:

$str = "Hello :special_text:! Look, I can write \:special_text:";
$pattern = /*???*/":special_text:";
$res = preg_replace($pattern, 'world', $str);
$res = str_replace("/:", ":", $res);
$res === "Hello world! Look, I can write :special_text:"; // => true

Другими словами, я бы хотел «убежать» от того, что я пишу.

Я думаю, что у меня что-то почти работает (используя [^:]? в качестве первой части шаблона), но я не думаю, что это работает, если $str === ":special_text:", in that ^ doesn't match [^:]? `.

Ответы [ 3 ]

1 голос
/ 12 февраля 2012

Вы можете использовать отрицательный вид сзади:

(?<!\\):special_text:

Это говорит: «замените :special_text:, которому не предшествует обратный слеш».

В ваших вторых str_replace взглядахкак вы хотите заменить \: на :.

Посмотреть в действии здесь .

Кроме того, не забывайте, если вы используете обратную косую черту в строках PHPвам нужно еще раз избежать их (если вам нужен литерал \, вам нужно использовать PHP \\, а чтобы получить литерал \\, вам нужно использовать PHP \\\\:

$pattern = '@(?<!\\\\):([^:]+):@';

Здесь @ - это просто разделитель регулярных выражений.

1 голос
/ 12 февраля 2012

$pattern = "/[^\\\\]*:special_text:/";

-или-

$pattern = "/(?<!\\\\):special_text:/";

В других ответах не учитывается необходимость супер-экранирования от обратной косой черты в этой ситуации. Это немного безумно.

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

0 голосов
/ 12 февраля 2012

Что-то вроде этого должно сделать это: /[^\\]\:([a-z]+)\:/i

Вы можете использовать RegexPal , чтобы отправить свое регулярное выражение против возможных строк в реальном времени.

...