PHP preg_替换两个字符串之间的文本

PHP preg_替换两个字符串之间的文本,php,regex,Php,Regex,我有一个字符串,它的模式类似于下面的$string(从论坛帖子中提取) 我试图使用preg_replace删除开始和结束[quote]标记之间的所有文本,并回显剩余的字符串:“我认为你不太好。”仅限于(上面的$string) 我用于正则表达式的模式应该是查找开始[quote]标记的开头,然后搜索,直到找到结束[quote]标记和标记的结尾] 不过,上面的内容似乎不能正常工作,我对reg表达式也不是很精通,所以我被困在这里。任何帮助都将不胜感激 注意:我尝试了drew010和bsdnoobz提供

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

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

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

不过,上面的内容似乎不能正常工作,我对reg表达式也不是很精通,所以我被困在这里。任何帮助都将不胜感激

注意:我尝试了drew010bsdnoobz提供的两种代码(感谢代码和解释) 但它仍然不起作用。问题是我没有正确捕获$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字符,看起来是新行字符或回车字符,这可能是阻止下面提交的正则表达式不适用于我的原因

$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.
注意:输入字符串中既有单引号,也有双引号。本例使用单引号包装输入字符串,并转义字符串中的任何单引号


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

以下是一种同样有效的模式:

$pattern = '/\[quote[^\]]*\].*?\[\/quote[^\]]*\]/is';
它将匹配您所拥有的格式,或者只需简单的引用,如
[quote]Text…[/quote]

要分解它:

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

\]
与期初
[quote]
标记末尾的结束
]
匹配

*?
匹配任何字符0次或更多次。此上下文中的
将取消此匹配(这意味着它将在首先匹配模式的下一部分而不是最后一部分时停止)


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

以下是一个同样有效的模式:

$pattern = '/\[quote[^\]]*\].*?\[\/quote[^\]]*\]/is';
它将匹配您所拥有的格式,或者只需简单的引用,如
[quote]Text…[/quote]

要分解它:

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

\]
与期初
[quote]
标记末尾的结束
]
匹配

*?
匹配任何字符0次或更多次。此上下文中的
将使此匹配取消冻结(意味着它将在首先匹配模式的下一部分而不是最后一部分时停止)


\[\/quote[^\]*\]
然后匹配
[/quote
和除
]之外的任何字符
0次或更多次,最后我们使用结束符
]

此外,由于您对正则表达式不熟悉,请注意
*?
的用法:这意味着,匹配任意字符任意次数,但以非贪婪的方式。默认情况下,正则表达式是贪婪的,这意味着它们将尽可能多地匹配。如果您只放置
*
,然后像
“[quote]first quote[/quote]some text[quote]second quote[/quote]”
这样的字符串将被转换为
@zi42感谢您对greedyness的良好解释:)正则表达式的一个微妙但重要的方面。感谢您的帮助。我的字符串中有错误的数据(字符串包含\n或\r)这导致您提供的正则表达式无法处理我的数据。是否有任何更改会起作用,\n或\r?我修复了字符串中的引号并添加了s标志,此正则表达式也起作用。。。thanks@user1427489在
s
修饰符(PCRE\u DOTALL)上找到了很好的结果如果希望
也匹配换行符,则需要使用该选项。此外,由于您对正则表达式不熟悉,请注意
*?
的用法:这表示,可以多次匹配任何字符,但要以非贪婪的方式。正则表达式默认情况下是贪婪的,这意味着它们将尽可能匹配。如果您只放置了
*
,然后像
“[quote]first quote[/quote]some text[quote]second quote][quote][quote]”
这样的字符串将被转换为
@zi42感谢您对greedyness的良好解释:)正则表达式的一个微妙但重要的方面。谢谢您的帮助。字符串中的数据不正确(字符串包含\n或\r),这导致您提供的正则表达式无法处理我的数据。无论是\n还是\r,是否有任何更改都会起作用?我修复了字符串中的引号,并添加了s标志,此正则表达式也起作用。。。thanks@user1427489在
s
修饰符(PCRE\u DOTALL)上找到了不错的结果,如果希望
也匹配换行符,这是必需的。这个答案至少部分不正确,因为正则表达式在默认情况下是贪婪的。
+
将匹配所有内容,直到最后一个可能的
]
,因此像
“[quote]first quote[/quote]某些文本[quote]second quote[/quote]”
这样的字符串将转换为
。您应该将所有的
+
替换为
+?
以使该部分匹配不贪婪。感谢您的帮助。字符串中的数据不正确(字符串包含\n或\r),这导致您提供的正则表达式无法处理我的数据。是否有任何更改会在不考虑\n或\r的情况下起作用?谢谢,我修复了字符串中的引号并添加了s标志,它起作用了。这个答案是