如何解决regex模式提取引号
| 在我的网站上切换辩论论坛的代码,我将更改报价存储在数据库中的方式。现在,我需要提出一个正则表达式来重新排列数据库中已提交的帖子。 以下是我当前的辩论帖子如何存储在数据库中的示例(引号中带有引号)。注意:为便于说明,我对其进行了缩进:Just citing a post
[quote]Text of quote #3
[quote]Text of quote #2
[quote]Text of quote #1
[name]User 1[/name]
[/quote]
[name]User 2[/name]
[/quote]
[name]User 3[/name]
[/quote]
我现在想要的是将前者重新排列为:
Just citing a post
[quote:User 3]
Text of quote #3
[quote:User 2]
Text of quote #2
[quote:User 1]
Text of quote #1
[/quote]
[/quote]
[/quote]
你们中的任何人都可以指出我如何使用正则表达式进行操作的方向吗?我正在使用PHP。
预先感谢,感谢您的帮助:)
费舍尔
解决方法
这样做:
$input = \"Just citing a post
[quote]Text of quote #3
[quote]Text of quote #2
[quote]Text of quote #1
[name]User 1[/name]
[/quote]
[name]User 2[/name]
[/quote]
[name]User 3[/name]
[/quote]\";
function fix_quotes($string) {
$regexp = \'`(\\s*)\\[quote\\]((?:[^\\[]|\\[(?!quote\\]))*?)\\[name\\](.*?)\\[\\/name\\]\\s*\\[\\/quote\\]`\';
while (preg_match($regexp,$string)) {
$string = preg_replace_callback($regexp,function($match) {
return $match[1] . \'[quote:\' . $match[3] . \']\' . trim(fix_quotes($match[2])) . $match[1] . \'[/quote]\';
},$string);
}
return $string;
}
echo fix_quotes($input);
结果是:
Just citing a post
[quote:User 3]Text of quote #3
[quote:User 2]Text of quote #2
[quote:User 1]Text of quote #1
[/quote]
[/quote]
[/quote]
编辑:还没有看到joelhardi已经发布了类似的解决方案,并且他的外观看起来更干净了,所以我会坚持使用他的解决方案:)
, 此功能将完成工作。它从最里面的报价到最外面的报价递归地重新格式化:
function reformat($str) {
while (preg_match(\'#\\[quote\\](.+)\\[name\\](.+)\\[/name\\]\\s*\\[/quote\\]#Us\',$str,$matches)) {
$str = str_replace($matches[0],\'[quote:\'.$matches[2].\']\'.$matches[1].\'[/quote]\',$str);
}
return $str;
}
实际上:
$before = \"Just citing a post
[quote]Text of quote #3
[quote]Text of quote #2
[quote]Text of quote #1
[name]User 1[/name]
[/quote]
[name]User 2[/name]
[/quote]
[name]User 3[/name]
[/quote]\";
echo reformat($before);
输出:
Just citing a post
[quote:User 3]Text of quote #3
[quote:User 2]Text of quote #2
[quote:User 1]Text of quote #1
[/quote]
[/quote]
[/quote]
, 由于这里涉及的复杂性(您将需要条件,以及“全部匹配/替换”功能),因此我建议不要仅在Regex中执行此操作。使用具有严格Regex功能的编程语言,并将Regex与该语言结合使用以完成您想要的事情。我推荐PHP。
, 不要为此使用正则表达式。您所说的本质上是XML的一种变体,而regex不是解析XML的正确工具。您需要做的是编写一个解析器。
但是,我建议使用的是实际的XML。它已经存在,已经标准化,语法几乎完全相同,并且已经有大量的解析器。我将从这里开始:
PHP XML解析器
编辑:只是为了澄清这变得容易成为有效的XML:
<quote src=\"User 3\">
Text of quote #3
<quote src=\"User 2\">
Text of quote #2
<quote src=\"User 1\">
Text of quote #1
</quote>
</quote>
</quote>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。