使用正则表达式查找*两个* html标记

使用正则表达式查找*两个* html标记

问题描述:

我需要从两个段落标记中提取内容,并使用<br />标记分解它。输入是像这样使用正则表达式查找*两个* html标记

<p> 
Yay 
</p> 
<p> 
StackOverFlow 
</p> 

它需要像

<p> 
Yay <br /> 
StackOverflow 
</p> 

我至今是<p><?php preg_match('/<p>(.*)<\/p>/', $content, $match); echo($match[1])."..."; ?></p>从而牵引只有第一个段落标记:

<p> 
Yay... 
</p> 

此外,有可能设置字符限制?例如,两个段落中最多有40个字符,或者我必须使用substr

谢谢!

所以这竟然是:

<?php $content = preg_replace('/<\/p>\s*<p>/', '<br/>', $content); echo substr("$content",0,180)."..."; ?> 
+3

为什么在地球上你需要做这样的事情?这是一个讽刺。 – Welbog 2009-10-27 12:38:03

+0

除了不使用正则表达式进行HTML匹配,我建议你不要使用'。*'构造,这些构造是贪婪的,虽然它们可以做你希望他们在小样本中做的事情,但他们会尝试“吃”很多更多情况下,稍后再次找到匹配的结束模式。 – Lucero 2009-10-27 12:41:48

我认为你让它变得比它需要的更复杂。既然你要崩溃了:

<p>Yay</p><p>StackOverFlow</p> 

到:

<p>Yay<br />StackOverflow</p> 

然后刚刚替补的</p><p>实例为<br>preg_replace('/<\/p>\s*<p>/', '<br/>', $input)


但一般情况下,请注意这种复杂的分析过程是使用正则表达式是充满了危险。更简洁:

“有些人在遇到问题时想'我知道,我会用正则表达式'。现在他们有两个问题。“ - Jamie Zawinski

+2

也许应该是'

\ s *

',看起来他们之间可能有换行符 – Kip 2009-10-27 12:44:25

+0

看看我的意思是充满危险吗? ;)感谢抓住,基普。 – 2009-10-27 13:05:35

+0

这是假设他想用
替换EVERY

。是这样吗? – Jay 2009-10-27 13:21:37

我的建议,正则表达式只能走这么远。看到我的一个帖子在这里: Extracting text fragment from a HTML body (in .NET)

它也有字符串截断正则表达式。

帮你一个忙,并使用HTML解析器(例如DOMDocument::loadHTML)。它更容易,更脆弱。