PHP условная замена строк - PullRequest
0 голосов
/ 04 июля 2010

Я пытаюсь заменить ~ на | между [ ] в следующем случае:

{stackoverflow is a [cool~great~fast] website ~ Find your answers [easily~quickly] on stackoverflow}.

Примечание: текст между [ ] может быть многострочным.

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

Мой самый близкий вызов на данный момент:

$text = preg_replace("/\[(.*?)~(.*?)\]/i", "[$1|$2]", $text);

Но это возвращает

{stackoverflow is a [cool~great|fast] website ~ Find your answers [easily|quickly] on stackoverflow}.

Ответы [ 3 ]

2 голосов
/ 04 июля 2010

Вам нужно использовать одно регулярное выражение, чтобы найти все строки в скобках, а затем другую, чтобы заменить ~ s в них.Вы можете использовать preg_replace_callback, чтобы применить регулярное выражение ~ для всех подстрок в скобках, например:

preg_replace_callback('/\[[^\]]+\]/', function ($str) {
    return str_replace('~', '|', $str[0]);
}, $my_string)
2 голосов
/ 04 июля 2010

проще, чем вы думаете

 echo preg_replace('/~(?=[^\[\]]*\])/s', '|', $a);

? = Является прогнозным утверждением и гласит «с последующим». То есть «тильда, за которой следуют некоторые не скобки, а затем закрывающая скобка» - это соответствует только ~ внутри []

0 голосов
/ 04 июля 2010

Какие примеры регулярных выражений вы использовали?Я сразу же подумал, что [] сбивает вас с толку, потому что это используется для сопоставления классов персонажей.Если вы хотите сопоставить [или] как литерал, вы должны экранировать его обратной косой чертой: \ [или \].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...