【问题标题】:preg_replace more lines phppreg_replace 更多行 php
【发布时间】:2015-12-14 17:19:35
【问题描述】:

代码:

$message = preg_replace("/<div style='background-color:#C0C8D0;width:95%;'>SMA Forr&aacute;sk&oacute;d: <a href='' onclick='selectcode\\((.*)\\);return false;'>\\[ Mindet kijelol \\]<\\/a><\\/div><div id='(.*)' style=\"width:95%;max-width:95%;max-height: 500px; overflow:scroll;background-color: #FFFFFF;\"><pre class=\"sma\" style=\"font-family:monospace;font-size: 12px;\"><ol><li style=\"font-weight: normal; vertical-align:top;\"><div style=\"font: normal normal 1em\\/1\\.2em monospace; margin:0; padding:0; background:none; vertical-align:top;\">(.*)<\\/div><\\/li><\\/ol><\\/pre><\\/div>/", '[sma]<pre>$3</pre>[/sma]',$message);

它的工作,只有当帖子只有一行。我想使用多行:

示例: 现在我编辑这篇文章

->

[sma]Now i edit this post[/sma]

很好,而且我还有更多的台词: 示例:

line1
line2
line3
line4
line5
line6

这个输出:

[sma]line1line2line3line4line5line6[/sma]

我想要:

[sma]line1

line2

line3

line4

line5

line6
[/sma]

多行html输出:

<div style='background-color:#C0C8D0;width:95%;'>SMA Forr&aacute;sk&oacute;d: <a href='' onclick='selectcode(93347);return false;'>[ Mindet kijelol ]</a></div><div id='93347' style="width:95%;max-width:95%;max-height: 500px; overflow:scroll;background-color: #FFFFFF;"><pre class="sma" style="font-family:monospace;font-size: 12px;"><ol><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">line1</div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">line2</div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">line3</div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">line4</div></li><li style="font-weight: normal; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">line5</div></li><li style="font-weight: bold; vertical-align:top;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">line6</div></li></ol></pre></div>

【问题讨论】:

  • 这个有点断章取义……好好解释一下你的要求
  • 您需要使用s 修饰符,以便. 扩展到换行符。您的“多行 html”都在这里一行,所以也许这不是问题?使用解析器可能会更好。
  • 您可能想从另一个 stackoverflow 问题尝试此链接:stackoverflow.com/questions/2240348/…
  • 使用 HTML 解析器。您遇到的问题是使用正则表达式处理 HTML 的第一大原因。

标签: php preg-replace html-parsing


【解决方案1】:

我相信您要么尝试在 PHP 中学习 regex 解析,要么尝试解析 HTML 以从中获得一些东西。我做了一次以创建一个名为hFeedsXML generator(检查开发分支以获取我的最新提交)。你应该看看它的代码,以防你试图实现同样的目标。 [注意:我很久以前就停止了它的工作,因为我使用 Laravel 框架开发了另一个更好的,目前正在为我的网站MonitorKashmir.comhaaput 赋能。

正如上面的 cmets 建议的那样,几乎不建议使用 regular expressions 解析 HTML。在大多数情况下,您应该使用HTML/XML Parsers,如上所述,例如; SimpleXMLPHP 中提供。

一些建议:

  1. Study 关于 SimpleXML 及其用法。
  2. 使用Regex101.com检查regular expressions及其代码生成器generate PHP code(至少暂时)

无论如何,对于上述问题,如果我们进行分析,我们需要一个重复自身的模式。在这种情况下,它是:

<div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">[CONTENT TO BE CAPTURED]</div>

所以我们只需要捕获[CONTENT TO BE CAPTURED] 部分就可以了。根据此处提供的所有信息,我假设 [CONTENT TO BE CAPTURED] 只是字母数字,也就是说,它只包含字母和数字,直到遇到下一个 &lt;/div&gt;

因此问题的解决方案将是以下{$str可以包含来自某些url的内容,例如;

$str = file_get_contents("http://www.example.com/example.html");

并且可以在下面的代码中进行相应的替换}。

$re = "/<div style=\"font: normal normal 1em\\/1\\.2em monospace; margin:0; padding:0; background:none; vertical-align:top;\">([[:alnum:]]*)<\\/div>/"; 
$str = "<div style='background-color:#C0C8D0;width:95%;'>SMA Forr&aacute;sk&oacute;d: <a href='' onclick='selectcode(93347);return false;'>[ Mindet kijelol ]</a></div><div id='93347' style=\"width:95%;max-width:95%;max-height: 500px; overflow:scroll;background-color: #FFFFFF;\"><pre class=\"sma\" style=\"font-family:monospace;font-size: 12px;\"><ol><li style=\"font-weight: normal; vertical-align:top;\"><div style=\"font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;\">line1</div></li><li style=\"font-weight: bold; vertical-align:top;\"><div style=\"font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;\">line2</div></li><li style=\"font-weight: normal; vertical-align:top;\"><div style=\"font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;\">line3</div></li><li style=\"font-weight: bold; vertical-align:top;\"><div style=\"font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;\">line4</div></li><li style=\"font-weight: normal; vertical-align:top;\"><div style=\"font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;\">line5</div></li><li style=\"font-weight: bold; vertical-align:top;\"><div style=\"font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;\">line6</div></li></ol></pre></div>\n"; 

preg_match_all($re, $str, $matches);

【讨论】:

  • 谢谢,str 不是常量,如果可能的话有 65000 行。
  • 它会只包含字母数字吗?还是html标签?
  • 根据您的链接,它只包含字母数字。以上应该没问题。但是,我正在重新编辑我上面的答案..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多