我正试图在~
|
之间将[
替换为]
:
{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}.
答案 0 :(得分:2)
您需要使用一个正则表达式来查找括号中的所有字符串,然后使用另一个正则表达式来替换其中的~
。您可以使用preg_replace_callback
应用~
- 将正则表达式替换为括号中的所有子字符串,如下所示:
preg_replace_callback('/\[[^\]]+\]/', function ($str) {
return str_replace('~', '|', $str[0]);
}, $my_string)
答案 1 :(得分:2)
比你想象的更简单
echo preg_replace('/~(?=[^\[\]]*\])/s', '|', $a);
?=是lookahead assertion并读取“后跟”。也就是说,“一个代字号后跟一些非括号,然后是一个右括号” - 这只匹配〜[]
答案 2 :(得分:0)
您使用的正则表达式的一些示例是什么?我的直接想法是[]正在绊倒你,因为它用于匹配字符类。如果要将[或]匹配为文字,则必须使用反斜杠转义它:\ [或\]。