我在一个奇怪的场景中,我需要在多列中显示内容。我正在使用 css3 列-cont 和 jquery 插件列化器用于旧版本的 IE。问题是我无法完全控制数据,因为它由外部 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。
提前谢谢你!
您的内容不稳定,正则表达式不会像这样对不同的内容施展魔法。话虽如此,每当您从其他网站接收数据时,很有可能有一天它会返回不同的模式,因此您的规则将不再好。您需要有一个可靠的来源才能获得可靠的结果。
这是一个肮脏的字符串操作,但如果模式保持一致,它将得到你需要的东西。而且,我仍然坚持认为您必须使用可靠的来源。
$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);
您可以使用此模式:
/(?<!^<p>)(<strong>.*?)(<strong>.*)$/gs
演示
请注意,仅当您的字符串以 <p>
开头时,否定后视中的排除才有效......因此,请考虑在应用正则表达式之前对其进行修剪...
<br>
标签必须使用另一个正则表达式或 str_replace() 删除
另外,考虑使用比正则表达式更合适的方法来解析 DOM HTML......