Ex:我有一个字符串“my str [str] string string [/ str] my str [str] string string [/ str] kjnvjsfn” 我试着用RegExp这样做
preg_match_all('/\[str](.|\n|\r\n)*\[\/str\]/', $str, $arr);
但它直到最后[/ str]整个字符串 感谢。
答案 0 :(得分:2)
设为non-greedy:使用*?
代替*
preg_match_all('/\[str](.|\n|\r\n)*?\[\/str\]/', $str, $arr);
然而,正则表达式可能不是最好的方法。即,它可能足够用于您的目的(如果您自己编写它们)。但如果“标签”可以嵌套,那么你会发现正则表达式方法变得非常麻烦。
答案 1 :(得分:0)
尝试让你的正则表达式非贪婪:
preg_match_all('/\[str](.*?)\[\/str\]/s', $str, $arr);
答案 2 :(得分:0)
是的,那是因为*是贪婪的。尝试使用非贪婪*?
preg_match_all('/\[str](.|\n|\r\n)*?\[\/str\]/', $str, $arr);
答案 3 :(得分:0)
您可以使用m和s修饰符来简化表达式
preg_match_all('/\[str\](.*?)\[\/str\]/ms', $str, $arr);
这个表达式非贪婪,即使它超过多行,也会匹配[str]和[/ str]之间的任何内容,因此您不需要匹配\r
或\n