我在一个奇怪的场景中,我需要在多列中显示内容。我正在使用旧版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。
提前谢谢!
答案 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
请注意,如果您的字符串以<p>
开头,那么在负面反馈中排除只会有效...所以在应用正则表达式之前请考虑 trim ...
<br>
个标记
另外,考虑使用另一种方法而不是Regex来解析DOM HTML ...