2010-07-29 71 views
0

我试图破解我正在开发的Wordpress模板中的一些侧边栏代码。基本上我已经在输出缓冲区中捕获了我需要的东西,并且运行了正则表达式来替换我需要的代码。问题是我的正则表达式知识对于我需要实现的东西来说有点短暂。在不破坏身份信息的情况下使用preg_replace

我遇到的问题是这样:

$output = preg_replace('/<\/li><li id=".*?" class="widget-container/', '<a href="top">Top</a></li><li><li id="[item from that find]" class="widget-container/', $input); 

在作为代码代表我能找到我所需要的时刻,但它会破坏那些ID属性,因为我无法捕捉它们。

我确定有一种方法可以在替换时捕获和使用它,但是我找不到任何能告诉我需要什么或者我是否用preg_replace采取了错误的方法。

如何在不破坏这些唯一ID的情况下使用它来更改代码?

干杯家伙!

+3

不要使用正则表达式解析HTML:http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – ircmaxell 2010-07-29 17:21:16

+0

有趣的阅读和有意义。在不久的将来可以使用像PHPQuery这样的HTML解析器来替换我正在使用的肮脏的正则表达式方法。感谢您将文章引入我的注意! – Leonard 2010-07-29 23:42:38

回答

1

您需要使用反向引用。使用捕捉ID(),然后引用捕获与$ 1 ...见下文:

$output = preg_replace('/<\/li><li id="(.*?)" class="widget-container/', '<a href="top">Top</a></li><li><li id="$1" class="widget-container/', $input); 
+1

为了清晰起见,我个人建议使用更精确的id =“([^”] +)“ – enobrev 2010-07-29 17:39:18

+0

干杯,这是个伎俩,我认为它符合$ 1的条件,但记不清楚。诚实的我不知道,括号是为了这一点,我认为这是数学风格分组。 感谢您的帮助。 – Leonard 2010-07-29 23:40:10

0

包裹要在(匹配)的模式,使用$ 1

0
$pattern = '/<\/li><li id="(.*?)" class="widget-container/'; 
$replace = '<a href="top">Top</a></li><li><li id="$1" class="widget-container/' 
$output = preg_replace($pattern, $replace, $input); 
相关问题