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