正则表达式内联选项

时间:2012-08-16 09:07:39

标签: php regex

我有一个文本已经在文本中有可能的值,我想在情境中显示正确的值。我对正则表达式并不是很好,我真的不知道如何解释我的问题,所以这里有一个例子。我几乎让它工作了:

$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应该显示|和之间的值。

3 个答案:

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