-1

我在一个奇怪的场景中,我需要在多个列中显示内容。我正在为旧版本的 IE 使用 css3 column-cont 和 jquery plugin columnizer。问题是我无法完全控制数据,因为它是由外部 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。

先感谢您!

4

2 回答 2

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);
于 2013-09-26T11:28:13.027 回答
0

您可以使用此模式:

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

演示

请注意,只有当您的字符串以 ... 开头时,否定后向中的排除才会起作用,<p>因此请考虑在应用正则表达式之前对其进行修剪...

<br>必须使用另一个正则表达式或str_replace()删除标签

另外,考虑也许使用除正则表达式之外的另一种方法来解析 DOM HTML...

于 2013-09-26T11:48:08.180 回答