0

我有一个字符串,它的模式与下面的 $string 类似(从论坛帖子中提取)。

$string = "[quote=\"abc123\":27zslwh3]I don't agree with most of the statements made here.[/quote:27zslwh3] I don't think that is very nice of you.";
$pattern = "/\[quote\=.\*\[\/quote.*\]/";
$replace = "";

$updated_text = preg_replace($pattern,$replace,$string);
echo $updated_text;

我正在尝试使用 preg_replace 删除开始和结束 [quote] 标记之间的所有文本并回显剩余的字符串:“我不认为你很好。” 仅(来自上面的 $string)。

我用于正则表达式的模式应该寻找开始 [quote] 标记的开头,然后搜索直到找到结束 [quote] 标记和标记的最后 ]。

上面的内容似乎无法正常工作,而且我对 reg 表达式不太精通,所以被困在这里。任何帮助,将不胜感激。

.

注意:我尝试了draw010bsdnoobz提供的两个代码(感谢代码和解释),但它仍然不起作用。问题是我没有正确捕获 $string 文本。它应该读作:

$string = '[quote="abc123":27zslwh3]I dont agree with most of the statements made here.

abc123[/quote:27zslwh3]
I dont think that is very nice of you.';

双引号有 html 字符,并且似乎是换行符或回车符,这可能是阻止下面提交的正则表达式对我不起作用的原因。

4

2 回答 2

2
$string = '[quote="abc123":27zslwh3]I don\'t agree with most of the statements made here.[/quote:27zslwh3] I don\'t think that is very nice of you.';
echo preg_replace('/\[quote.+?\].+?\[\/quote.+?\]/is', '',$string);
// will print: I don't think that is very nice of you.

注意:输入字符串中有单引号和双引号。此示例用单引号包裹输入字符串,并转义字符串中的任何单引号。

于 2012-05-31T05:07:34.173 回答
2

这是一个也有效的模式:

$pattern = '/\[quote[^\]]*\].*?\[\/quote[^\]]*\]/is';

它将匹配您所拥有的格式,或者只是简单的引号,例如[quote]Text...[/quote]

分解它:

\[quote[^\]]*\]表示匹配文本和0 次或多次 以外[quote的任何字符 ]

\]匹配]开始[quote]标签末尾的结束。

.*?匹配任何字符 0 次或更多次。在?这种情况下,这个匹配是不贪婪的(这意味着它将在它首先匹配模式的下一部分时停止,而不是最后一个。

\[\/quote[^\]]*\]然后匹配0 次或多次以外[/quote的任何字符,最后我们消耗结束 ]]

于 2012-05-31T05:09:10.073 回答