我有一个文本已经在文本中有可能的值,我想在情境中显示正确的值。我对正则表达式并不是很好,我真的不知道如何解释我的问题,所以这里有一个例子。我几乎让它工作了:
$string = "This [was a|is the] test!";
preg_replace('/\[(.*)\|(.*)\]/', '$1', $string);
// results in "This was a text!"
preg_replace('/\[(.*)\|(.*)\]/', '$2', $string);
// results in "This is the test!"
这没有问题但是当它有两个部分时它不再起作用,因为它从最后一个获得结束括号。
$string = "This [was a|is the] so this is [bullshit|filler] text";
preg_replace('/\[(.*)\|(.*)\]/', '$1', $string);
//results in "This was a|is the] test so this is [bullshit text"
preg_replace('/\[(.*)\|(.*)\]/', '$2', $string);
//results in "This filler text"
情境1应该是(和|之间的值,而情况2应该显示|和之间的值。
答案 0 :(得分:5)
你的probem是正则表达式greediness。在?
之后添加.*
,使其仅使用方括号内的字符串:
preg_replace('/\[(.*?)\|(.*?)\]/', '$1', $string);
同样可以使用/U
ungreedy修饰符。更好的是使用更具体的匹配代替.*?
任何东西。
答案 1 :(得分:2)
而不是使用:
(.*)
...要匹配选项组内的内容,请使用:
([^|\]]*)
该模式匹配任何不是|的东西或者a],反复。
答案 2 :(得分:1)
您可以在|
中禁止.*
字符替换.
[^|]
(意思是“不|
”)。
$string = "This [was a|is the] so this is [bullshit|filler] text";
echo preg_replace('/\[([^|]*)\|([^|]*)\]/', '$1', $string);
// results in "This was a so this is bullshit text"
echo '<br />';
echo preg_replace('/\[([^|]*)\|([^|]*)\]/', '$2', $string);
// results in "This is the so this is filler text"