1

我的文本中已经包含可能的值,我想在某些情况下显示正确的值。我不太擅长正则表达式,我真的不知道如何解释我的问题,所以这里有一个例子。我已经让它几乎工作了:

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

4

3 回答 3

5

您的问题是正则表达式贪婪。添加一个?after.*使其仅使用方括号内的字符串:

 preg_replace('/\[(.*?)\|(.*?)\]/', '$1', $string);

同样,您可以使用/Uungreedy 修饰符。更好的是使用更具体的匹配来代替.*?任何东西。

于 2012-08-16T09:15:08.977 回答
2

而不是使用:

(.*)

...要匹配选项组中的内容,请使用以下命令:

([^|\]]*)

该模式匹配任何不是 | 或],重复。

于 2012-08-16T09:14:16.357 回答
1

您可以在替换with时禁止使用|字符(这意味着“否”)。.*.[^|]|

$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"
于 2012-08-16T09:17:15.247 回答