使用preg_split拆分带字母数字和fullstops的字符串

时间:2016-07-23 02:59:50

标签: php regex preg-split

我正在尝试使用以下代码使用R401.4R402.3.4等分隔符拆分大字符串:

<?php
  $chapter = "http://codes.iccsafe.org/app/book/content/2015-I-Codes/2015%20IRC%20HTML/Chapter%204.html";

  $data = file_get_contents($chapter);

  $split = preg_split('/(<b>[R]\d{3}[.][0-9])/' , $data, -1, PREG_SPLIT_DELIM_CAPTURE);

  print_r($split);
?>

当我在PHP中运行时,我得到一个不正确的分割,如下所示,我得到了一个我想要的分割,然后是它而不是仅仅在每个R401.部分:

  

[3] =&gt; R401.2 [4] =&gt;要求。基础施工应能够按照第R301和第R301节的规定容纳所有载荷   将产生的载荷传递到支撑土壤。填土   应设计,安装和支撑基础和基础   按照公认的工程实践进行测试。砾石填充   用作木材和预制混凝土基础的基础   符合第R403节。

     

[5] =&gt; R401.3 [6] =&gt;引流。地面排水应转向   风暴下水道运输工具或其他批准的收集点   不会造成危害。批次应分级以排出地表水   远离基础墙。等级应至少降至6英寸   在前10英尺(3048毫米)内(152毫米)。

     

例外:批次线,墙壁,斜坡或其他物理障碍   禁止在10英尺(3048毫米)范围内下降6英寸(152毫米),排水或   洼地的建造应确保排水远离洼地   结构体。在10英尺(3048毫米)范围内的不透水表面   建筑物基础应倾斜至少2%   建筑物。

     

[7] =&gt; R401.4 [8] =&gt;土壤测试。

但是当我在正常表达式测试网站regexer.com上尝试我的表达时,它似乎正常工作。

http://regexr.com/3ds6l

我的regex是否有问题,或者这与preg_match中的php有什么关系?

我正在寻找的是我的数组格式如下:

  

[3] =&gt; R401.2要求。基础施工应能够按照第R301和第R301节的规定容纳所有载荷   将产生的载荷传递到支撑土壤。填土   应设计,安装和支撑基础和基础   按照公认的工程实践进行测试。砾石填充   用作木材和预制混凝土基础的基础   符合第R403节。

     

[4] =&gt; R401.3排水。地面排水应转向   风暴下水道运输工具或其他批准的收集点   不会造成危害。批次应分级以排出地表水   远离基础墙。等级应至少降至6英寸   在前10英尺(3048毫米)内(152毫米)。

注意:我知道使用DOM

解析页面通常会更好

感谢。

2 个答案:

答案 0 :(得分:0)

使用前瞻性断言解决了这个问题,如下所示:PHP preg_split while keeping delimiter at the start of array element

<?php
  $chapter = "http://codes.iccsafe.org/app/book/content/2015-I-Codes/2015%20IRC%20HTML/Chapter%204.html";

  $data = file_get_contents($chapter);

  $split = preg_split('/(?=<b>[R]\d{3}[.][0-9])/' , $data, -1, PREG_SPLIT_DELIM_CAPTURE);

  print_r($split);
?>

答案 1 :(得分:0)

因为您没有捕获任何内容,所以您不需要使用PREG_SPLIT_DELIM_CAPTURE

这是一个简化版本:

$data=file_get_contents('http://codes.iccsafe.org/app/book/content/2015-I-Codes/2015%20IRC%20HTML/Chapter%204.html');
$split=preg_split('/(?=<b>R\d{3}\.\d)/',$data);
var_export($split);

(您提供的网址不允许访问该文本,因此我无法提供演示/输出。)