正则表达 - 天使害怕畏惧

时间:2011-01-29 06:08:11

标签: php regex

我刚刚开始在PHP中学习正则表达式,但是我在WWW上的一些教程中遇到了很糟糕的时间,似乎无法找到满足我当前需求的任何东西。也许我想要学得太快太多。 PHP的这个方面对我来说是全新的。

我正在尝试创建的是一个正则表达式,用于替换第n次出现的< TAG>之间的所有HTML代码。和< / TAG>我选择的任何代码。

我的最终目标是在PHP中建立一个互联网过滤器,通过该过滤器,我可以在任何指定的标签集之间查看剥离了某些内容(或替换为消毒内容)的网页< TAG> ...< / TAG&gt ;在页面内,< TAG> ...< / TAG>表示任何有效的配对HTML标记,例如< B> ...< / B>或< SPAN> ...< / SPAN>或< DIV> ......< / DIV>等等。

例如,如果该网页包含第5个< DIV>中包含的色情广告...< / DIV>在页面内的块中,可以调用什么正则表达式来定位并用其他东西替换该代码,例如xxxxxxx,但只有第5个< DIV>在页面内阻止而没有其他内容?

整个网页包含在单个文本字符串中,过滤后的结果也应该是单个文本字符串。

我不确定,但我认为执行此操作的代码的格式类似于:

$FilteredPage = preg_replace("REG EXPRESSION", "xxxxxxxx", $OriginalPage);

要调用的“REG EXPRESSION”是我需要知道的,“xxxxxxxx”表示替换“REG EXPRESSION”所针对的标记之间的代码的文本。

正则表达式显然是撒旦的作品!

我将非常感谢任何一般性建议或者我可以研究和试验的一些工作实例。

谢谢,杰伊

3 个答案:

答案 0 :(得分:3)

这已经完成了死亡,但请不要使用正则表达式来解析HTML。只是停下来,放弃......小猫上帝会为你做这件事而不值得。使用真正的HTML或XML解析器

在更具建设性的说明中,将xpath视为一种更适合描述您可能要替换的html节点的技术......或者phpQuery和QueryPath

当您使用正则表达式解析HTML时,上帝杀死小猫的原因:

Html不是常规语言,因此正则表达式只能解析非常有限的html。 HTML是一种无上下文的语言,因此只能使用无上下文解析器进行正确解析。

编辑:谢谢你@Andrew Grimm,这比我说的要好得多,正如第一个答案所证明的那样,超过四个 upvotes!

RegEx match open tags except XHTML self-contained tags

答案 1 :(得分:3)

首先,您是否正在使用合适的工具? Regex是一个文本匹配引擎,而不是一个完整的解析器 - 也许一个专用的HTML解析器可以提供更好的结果。

其次,在解决任何编程问题时,尝试简化问题并逐块构建,而不是直接跳到最终解决方案。例如,您可以:

从一个简单的普通英文文本块开始,尝试匹配并替换(例如)单词“和”的每一个出现。

当它工作时,将其包装在PHP循环中,该循环最多可以计数5并且仅替换第5次出现。当PHP在这项任务上做得更好时,为什么要使用正则表达式来计算呢?

然后修改你的正则表达式以匹配你的第5个HTML标签(这有点难,因为<>是特殊字符,需要转义)

通过逐步解决问题,您将能够让每个部分轮流工作并构建您理解的可靠解决方案。

答案 2 :(得分:0)

好的,没有什么基本规则。

  • 不要发布这样的问题,提出所有问题,只会让人远离
  • 正则表达式很棒!
  • 如果您想考虑选项,请查看如何将html读取为xml文档并使用xpath解析它
  • @tobyodavies非常正确,如果您想要这样做,我会包含答案

现在,你的问题。有了这个:

$regex = "#<div>(.+?)</div>#si";

你应该可以使用那个表达式并计算出现次数,就像这样:

preg_match_all($regex, $htmlcontent, $matches, PREG_SET_ORDER );

假设您只需要第5个。匹配[$ i] [0]是$ i-eth匹配的整个字符串

if (count($matches) > 5 )
{
   $myMatch = $matches[5][0];
   $matchedText = $matches[5][1];
}

祝你好运......