PHP条件字符串替换

时间:2010-07-03 22:40:43

标签: php regex string

我正试图在~ |之间将[替换为]

{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 个答案:

答案 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)

您使用的正则表达式的一些示例是什么?我的直接想法是[]正在绊倒你,因为它用于匹配字符类。如果要将[或]匹配为文字,则必须使用反斜杠转义它:\ [或\]。