在正则表达式中需要帮助

时间:2013-09-26 11:02:20

标签: php regex

我在一个奇怪的场景中,我需要在多列中显示内容。我正在使用旧版IE的css3 column-cont和jquery插件列控器。 问题是我无法完全控制数据,因为它是由外部Web服务提供的。 在大多数情况下,内容包含在多个段落选项卡中

Content#1

 <p><strong>Heading</strong><br>This is a content</p>
 <p><strong>Heading</strong><br>This is a content</p>

但在少数情况下,数据未包含在<p>标记中,如下所示:

Content#2

<strong>Day 1: xyz </strong><br>
 lorem lipsum <br> <br> 
<strong>Dag 2: lorem lipsum</strong><br> 
Morgonflyg till Arequipa i södra Peru.
<br> <br> 

真正的问题是jquery columnizer插件在要求对此类内容进行列化时,会使用此标记挂起浏览器。

现在我想借助正则表达式将Content#2转换为Content#1,即将内容包装成合理的段落。我希望我已经说清楚了 我正在使用PHP。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您的内容不稳定,正则表达式不会使用此类不同的内容制作魔法。有了这样说,每当你从其他网站收到数据时,很可能有一天它会返回不同的模式,所以你的规则将不再好。您需要有可靠的来源才能获得可靠的结果。

这是一个肮脏的字符串操作,但如果模式保持一致,它将获得您所需的。并且,我仍然坚持你必须使用可靠的来源。

$str = "<strong>Day 1: xyz </strong><br>
 lorem lipsum <br> <br>
<strong>Dag 2: lorem lipsum</strong><br>
Morgonflyg till Arequipa i södra Peru.
<br> <br> ";

function parse($data)
{
  if(substr($data, 0, 3) == "<p>") return $data;

  $chunks = explode("<strong>", $data);
  $out = array();

  foreach($chunks as $chunk)
  {
    $item = $chunk;

    $last_br = strpos($item, "<br> <br>");
    if($last_br > -1){ $item = substr($item, 0, $last_br); }

    $item = "<p>" . $item . "</p>";

    $out[] = $item;
  }

  return implode("\n", $out);
}

echo parse($str);

答案 1 :(得分:0)

您可以使用此模式:

/(?<!^<p>)(<strong>.*?)(<strong>.*)$/gs

Demo

请注意,如果您的字符串以<p>开头,那么在负面反馈中排除只会有效...所以在应用正则表达式之前请考虑 trim ...

必须使用其他正则表达式或str_replace()

删除

<br>个标记

另外,考虑使用另一种方法而不是Regex来解析DOM HTML ...